1
Fork 0

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:
Alex Crichton 2014-04-18 17:33:47 -07:00
parent b75683cadf
commit 55310acbca

View file

@ -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");
}
} }