@@ -8,13 +8,18 @@ use rustc_demangle::demangle;
88use std:: io;
99use std:: io:: prelude:: * ;
1010
11- fn demangle_line ( line : & str ) -> String {
11+ fn demangle_line ( no_verbose : bool , line : & str ) -> String {
1212 lazy_static ! {
1313 static ref RE : Regex = Regex :: new( r"[_a-zA-Z$][_a-zA-Z$0-9.]*" ) . unwrap( ) ;
1414 }
1515
1616 RE . replace_all ( line, |caps : & Captures < ' _ > | {
17- format ! ( "{:#}" , demangle( caps. get( 0 ) . unwrap( ) . as_str( ) ) )
17+ let demangled = demangle ( caps. get ( 0 ) . unwrap ( ) . as_str ( ) ) ;
18+ if no_verbose {
19+ format ! ( "{:#}" , demangled)
20+ } else {
21+ format ! ( "{}" , demangled)
22+ }
1823 } )
1924 . to_string ( )
2025}
@@ -26,40 +31,69 @@ mod tests {
2631 #[ test]
2732 fn passes_text ( ) {
2833 assert_eq ! (
29- demangle_line( "mo fo\t boom hello " ) ,
34+ demangle_line( true , "mo fo\t boom hello " ) ,
3035 "mo fo\t boom hello "
3136 ) ;
3237 }
3338
3439 #[ test]
3540 fn demangles ( ) {
3641 assert_eq ! (
37- demangle_line( "_ZN7example4main17h0db00b8b32acffd5E:" ) ,
42+ demangle_line( true , "_ZN7example4main17h0db00b8b32acffd5E:" ) ,
3843 "example::main:"
3944 ) ;
4045 }
4146
4247 #[ test]
4348 fn handles_mid_demangling ( ) {
4449 assert_eq ! (
45- demangle_line( " lea rax, [rip + _ZN55_$LT$$RF$$u27$a$u20$T$u20$as$u20$core..fmt..Display$GT$3fmt17h510ed05e72307174E]" ) ,
50+ demangle_line( true , " lea rax, [rip + _ZN55_$LT$$RF$$u27$a$u20$T$u20$as$u20$core..fmt..Display$GT$3fmt17h510ed05e72307174E]" ) ,
4651 " lea rax, [rip + <&\' a T as core::fmt::Display>::fmt]" ,
4752 ) ;
4853 }
4954
5055 #[ test]
5156 fn handles_call_plt ( ) {
5257 assert_eq ! (
53- demangle_line( " call _ZN3std2io5stdio6_print17he48522be5b0a80d9E@PLT" ) ,
58+ demangle_line( true , " call _ZN3std2io5stdio6_print17he48522be5b0a80d9E@PLT" ) ,
5459 " call std::io::stdio::_print@PLT"
5560 ) ;
5661 }
62+
63+ #[ test]
64+ fn includes_hash_in_verbose_mode ( ) {
65+ assert_eq ! (
66+ demangle_line( false , "_ZN4core3fmt9Arguments9new_const17hf7eafdf6c5e03508E" ) ,
67+ "core::fmt::Arguments::new_const::hf7eafdf6c5e03508" ,
68+ ) ;
69+ }
70+
71+ #[ test]
72+ fn demangles_v0_symbols ( ) {
73+ assert_eq ! (
74+ demangle_line( true , "_RNvCslMLAjg8TrSC_7example4meow" ) ,
75+ "example::meow" ,
76+ ) ;
77+ }
78+
79+ #[ test]
80+ fn demangles_double_underscore_prefixed_symbols ( ) {
81+ assert_eq ! (
82+ demangle_line( true , "__RINvMs2_NtCslVVlGMZyABT_4core3fmtNtB6_9Arguments9new_constKj1_ECslMLAjg8TrSC_7example" ) ,
83+ "<core::fmt::Arguments>::new_const::<1>" ,
84+ ) ;
85+ assert_eq ! (
86+ demangle_line( true , "__ZN4core3fmt9Arguments9new_const17hf7eafdf6c5e03508E" ) ,
87+ "core::fmt::Arguments::new_const" ,
88+ ) ;
89+ }
5790}
5891
5992fn main ( ) {
93+ let no_verbose = std:: env:: args ( ) . any ( |arg| arg == "--no-verbose" ) ;
6094 let stdin = io:: stdin ( ) ;
6195
6296 for line in stdin. lock ( ) . lines ( ) {
63- println ! ( "{}" , demangle_line( & line. unwrap( ) ) ) ;
97+ println ! ( "{}" , demangle_line( no_verbose , & line. unwrap( ) ) ) ;
6498 }
6599}
0 commit comments