@@ -66,8 +66,18 @@ fn demangle(writer: &mut Writer, s: &str) -> IoResult<()> {
66
66
// expecting, we just print it literally. Note that we must handle non-rust
67
67
// symbols because we could have any function in the backtrace.
68
68
let mut valid = true ;
69
+ let mut inner = s;
69
70
if s. len ( ) > 4 && s. starts_with ( "_ZN" ) && s. ends_with ( "E" ) {
70
- let mut chars = s. slice ( 3 , s. len ( ) - 1 ) . chars ( ) ;
71
+ inner = s. slice ( 3 , s. len ( ) - 1 ) ;
72
+ // On Windows, dbghelp strips leading underscores, so we accept "ZN...E" form too.
73
+ } else if s. len ( ) > 3 && s. starts_with ( "ZN" ) && s. ends_with ( "E" ) {
74
+ inner = s. slice ( 2 , s. len ( ) - 1 ) ;
75
+ } else {
76
+ valid = false ;
77
+ }
78
+
79
+ if valid {
80
+ let mut chars = inner. chars ( ) ;
71
81
while valid {
72
82
let mut i = 0 ;
73
83
for c in chars {
@@ -84,28 +94,25 @@ fn demangle(writer: &mut Writer, s: &str) -> IoResult<()> {
84
94
valid = false ;
85
95
}
86
96
}
87
- } else {
88
- valid = false ;
89
97
}
90
98
91
99
// Alright, let's do this.
92
100
if !valid {
93
101
try!( writer. write_str ( s) ) ;
94
102
} else {
95
- let mut s = s. slice_from ( 3 ) ;
96
103
let mut first = true ;
97
- while s . len ( ) > 1 {
104
+ while inner . len ( ) > 0 {
98
105
if !first {
99
106
try!( writer. write_str ( "::" ) ) ;
100
107
} else {
101
108
first = false ;
102
109
}
103
- let mut rest = s ;
110
+ let mut rest = inner ;
104
111
while rest. char_at ( 0 ) . is_numeric ( ) {
105
112
rest = rest. slice_from ( 1 ) ;
106
113
}
107
- let i: uint = from_str ( s . slice_to ( s . len ( ) - rest. len ( ) ) ) . unwrap ( ) ;
108
- s = rest. slice_from ( i) ;
114
+ let i: uint = from_str ( inner . slice_to ( inner . len ( ) - rest. len ( ) ) ) . unwrap ( ) ;
115
+ inner = rest. slice_from ( i) ;
109
116
rest = rest. slice_to ( i) ;
110
117
while rest. len ( ) > 0 {
111
118
if rest. starts_with ( "$" ) {
@@ -999,6 +1006,9 @@ mod imp {
999
1006
Some ( s) => try!( super :: demangle ( w, s) ) ,
1000
1007
None => try!( w. write ( bytes[ ..bytes. len ( ) -1 ] ) ) ,
1001
1008
}
1009
+ if displacement != 0 {
1010
+ try!( write ! ( w, "+{:#x}" , displacement) ) ;
1011
+ }
1002
1012
}
1003
1013
try!( w. write ( & [ '\n' as u8 ] ) ) ;
1004
1014
}
@@ -1037,4 +1047,11 @@ mod test {
1037
1047
t ! ( "_ZN12test$x20test4foobE" , "test test::foob" ) ;
1038
1048
t ! ( "_ZN12test$UP$test4foobE" , "testBoxtest::foob" ) ;
1039
1049
}
1050
+
1051
+ #[ test]
1052
+ fn demangle_windows ( ) {
1053
+ t ! ( "yZN4testE" , "test" ) ;
1054
+ t ! ( "ZN12test$x20test4foobE" , "test test::foob" ) ;
1055
+ t ! ( "ZN12test$UP$test4foobE" , "testBoxtest::foob" ) ;
1056
+ }
1040
1057
}
0 commit comments