@@ -91,8 +91,47 @@ fn demangle(writer: &mut Writer, s: &str) -> IoResult<()> {
91
91
rest = rest. slice_from ( 1 ) ;
92
92
}
93
93
let i: uint = from_str ( s. slice_to ( s. len ( ) - rest. len ( ) ) ) . unwrap ( ) ;
94
- try!( writer. write_str ( rest. slice_to ( i) ) ) ;
95
94
s = rest. slice_from ( i) ;
95
+ rest = rest. slice_to ( i) ;
96
+ loop {
97
+ if rest. starts_with ( "$" ) {
98
+ macro_rules! demangle(
99
+ ( $( $pat: expr => $demangled: expr) ,* ) => ( {
100
+ $( if rest. starts_with( $pat) {
101
+ try!( writer. write_str( $demangled) ) ;
102
+ rest = rest. slice_from( $pat. len( ) ) ;
103
+ } else) *
104
+ {
105
+ try!( writer. write_str( rest) ) ;
106
+ break ;
107
+ }
108
+
109
+ } )
110
+ )
111
+ // see src/librustc/back/link.rs for these mappings
112
+ demangle ! (
113
+ "$SP$" => "@" ,
114
+ "$UP$" => "~" ,
115
+ "$RP$" => "*" ,
116
+ "$BP$" => "&" ,
117
+ "$LT$" => "<" ,
118
+ "$GT$" => ">" ,
119
+ "$LP$" => "(" ,
120
+ "$RP$" => ")" ,
121
+ "$C$" => "," ,
122
+
123
+ // in theory we can demangle any unicode code point, but
124
+ // for simplicity we just catch the common ones.
125
+ "$x20" => " " ,
126
+ "$x27" => "'" ,
127
+ "$x5b" => "[" ,
128
+ "$x5d" => "]"
129
+ )
130
+ } else {
131
+ try!( writer. write_str ( rest) ) ;
132
+ break ;
133
+ }
134
+ }
96
135
}
97
136
}
98
137
@@ -698,17 +737,25 @@ mod test {
698
737
use io:: MemWriter ;
699
738
use str;
700
739
740
+ macro_rules! t( ( $a: expr, $b: expr) => ( {
741
+ let mut m = MemWriter :: new( ) ;
742
+ super :: demangle( & mut m, $a) . unwrap( ) ;
743
+ assert_eq!( str :: from_utf8_owned( m. unwrap( ) ) . unwrap( ) , $b. to_owned( ) ) ;
744
+ } ) )
745
+
701
746
#[ test]
702
747
fn demangle ( ) {
703
- macro_rules! t( ( $a: expr, $b: expr) => ( {
704
- let mut m = MemWriter :: new( ) ;
705
- super :: demangle( & mut m, $a) ;
706
- assert_eq!( str :: from_utf8_owned( m. unwrap( ) ) . unwrap( ) , $b. to_owned( ) ) ;
707
- } ) )
708
-
709
748
t ! ( "test" , "test" ) ;
710
749
t ! ( "_ZN4testE" , "test" ) ;
711
750
t ! ( "_ZN4test" , "_ZN4test" ) ;
712
751
t ! ( "_ZN4test1a2bcE" , "test::a::bc" ) ;
713
752
}
753
+
754
+ #[ test]
755
+ fn demangle_dollars ( ) {
756
+ t ! ( "_ZN4$UP$E" , "~" ) ;
757
+ t ! ( "_ZN8$UP$testE" , "~test" ) ;
758
+ t ! ( "_ZN8$UP$test4foobE" , "~test::foob" ) ;
759
+ t ! ( "_ZN8$x20test4foobE" , " test::foob" ) ;
760
+ }
714
761
}
0 commit comments