std: Fix demangling with middle special chars
Previously, symbols with rust escape sequences (denoted with dollar signs) weren't demangled if the escape sequence showed up in the middle. This alters the printing loop to look through the entire string for dollar characters.
This commit is contained in:
parent
b75683cadf
commit
55310acbca
1 changed files with 13 additions and 3 deletions
|
@ -109,7 +109,7 @@ fn demangle(writer: &mut Writer, s: &str) -> IoResult<()> {
|
||||||
let i: uint = from_str(s.slice_to(s.len() - rest.len())).unwrap();
|
let i: uint = from_str(s.slice_to(s.len() - rest.len())).unwrap();
|
||||||
s = rest.slice_from(i);
|
s = rest.slice_from(i);
|
||||||
rest = rest.slice_to(i);
|
rest = rest.slice_to(i);
|
||||||
loop {
|
while rest.len() > 0 {
|
||||||
if rest.starts_with("$") {
|
if rest.starts_with("$") {
|
||||||
macro_rules! demangle(
|
macro_rules! demangle(
|
||||||
($($pat:expr => $demangled:expr),*) => ({
|
($($pat:expr => $demangled:expr),*) => ({
|
||||||
|
@ -144,8 +144,12 @@ fn demangle(writer: &mut Writer, s: &str) -> IoResult<()> {
|
||||||
"$x5d" => "]"
|
"$x5d" => "]"
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
try!(writer.write_str(rest));
|
let idx = match rest.find('$') {
|
||||||
break;
|
None => rest.len(),
|
||||||
|
Some(i) => i,
|
||||||
|
};
|
||||||
|
try!(writer.write_str(rest.slice_to(idx)));
|
||||||
|
rest = rest.slice_from(idx);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -774,4 +778,10 @@ mod test {
|
||||||
t!("_ZN8$UP$test4foobE", "~test::foob");
|
t!("_ZN8$UP$test4foobE", "~test::foob");
|
||||||
t!("_ZN8$x20test4foobE", " test::foob");
|
t!("_ZN8$x20test4foobE", " test::foob");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn demangle_many_dollars() {
|
||||||
|
t!("_ZN12test$x20test4foobE", "test test::foob");
|
||||||
|
t!("_ZN12test$UP$test4foobE", "test~test::foob");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue