From 55310acbca84abfbb3636440a849a2e77d03992c Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Fri, 18 Apr 2014 17:33:47 -0700 Subject: [PATCH] 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. --- src/libstd/rt/backtrace.rs | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/libstd/rt/backtrace.rs b/src/libstd/rt/backtrace.rs index bf8c15c20ab..c3bf7a6d12a 100644 --- a/src/libstd/rt/backtrace.rs +++ b/src/libstd/rt/backtrace.rs @@ -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(); s = rest.slice_from(i); rest = rest.slice_to(i); - loop { + while rest.len() > 0 { if rest.starts_with("$") { macro_rules! demangle( ($($pat:expr => $demangled:expr),*) => ({ @@ -144,8 +144,12 @@ fn demangle(writer: &mut Writer, s: &str) -> IoResult<()> { "$x5d" => "]" ) } else { - try!(writer.write_str(rest)); - break; + let idx = match rest.find('$') { + 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$x20test4foobE", " test::foob"); } + + #[test] + fn demangle_many_dollars() { + t!("_ZN12test$x20test4foobE", "test test::foob"); + t!("_ZN12test$UP$test4foobE", "test~test::foob"); + } }