diff options
| author | Aaron Turon <aturon@mozilla.com> | 2014-12-18 19:41:20 -0800 |
|---|---|---|
| committer | Aaron Turon <aturon@mozilla.com> | 2014-12-18 23:35:53 -0800 |
| commit | a9e7669cdc551588144a5b56db0b42dd35b71876 (patch) | |
| tree | c67441c5a1f7dbec4370a291966e4651eee8f852 /src/libstd/sys/common | |
| parent | f4c0c0ff42e81a47c4e1e6985db62a28a8576406 (diff) | |
| download | rust-a9e7669cdc551588144a5b56db0b42dd35b71876.tar.gz rust-a9e7669cdc551588144a5b56db0b42dd35b71876.zip | |
Rebasing fixes.
Diffstat (limited to 'src/libstd/sys/common')
| -rw-r--r-- | src/libstd/sys/common/backtrace.rs | 28 | ||||
| -rw-r--r-- | src/libstd/sys/common/thread_info.rs | 2 |
2 files changed, 19 insertions, 11 deletions
diff --git a/src/libstd/sys/common/backtrace.rs b/src/libstd/sys/common/backtrace.rs index 2ff82bfd7a9..a39c8d6d8fe 100644 --- a/src/libstd/sys/common/backtrace.rs +++ b/src/libstd/sys/common/backtrace.rs @@ -40,8 +40,18 @@ pub fn demangle(writer: &mut Writer, s: &str) -> IoResult<()> { // expecting, we just print it literally. Note that we must handle non-rust // symbols because we could have any function in the backtrace. let mut valid = true; + let mut inner = s; if s.len() > 4 && s.starts_with("_ZN") && s.ends_with("E") { - let mut chars = s.slice(3, s.len() - 1).chars(); + inner = s.slice(3, s.len() - 1); + // On Windows, dbghelp strips leading underscores, so we accept "ZN...E" form too. + } else if s.len() > 3 && s.starts_with("ZN") && s.ends_with("E") { + inner = s.slice(2, s.len() - 1); + } else { + valid = false; + } + + if valid { + let mut chars = inner.chars(); while valid { let mut i = 0; for c in chars { @@ -58,32 +68,29 @@ pub fn demangle(writer: &mut Writer, s: &str) -> IoResult<()> { valid = false; } } - } else { - valid = false; } // Alright, let's do this. if !valid { try!(writer.write_str(s)); } else { - let mut s = s.slice_from(3); let mut first = true; - while s.len() > 1 { + while inner.len() > 0 { if !first { try!(writer.write_str("::")); } else { first = false; } - let mut rest = s; + let mut rest = inner; while rest.char_at(0).is_numeric() { rest = rest.slice_from(1); } - let i: uint = from_str(s.slice_to(s.len() - rest.len())).unwrap(); - s = rest.slice_from(i); + let i: uint = from_str(inner.slice_to(inner.len() - rest.len())).unwrap(); + inner = rest.slice_from(i); rest = rest.slice_to(i); while rest.len() > 0 { if rest.starts_with("$") { - macro_rules! demangle( + macro_rules! demangle { ($($pat:expr => $demangled:expr),*) => ({ $(if rest.starts_with($pat) { try!(writer.write_str($demangled)); @@ -95,7 +102,8 @@ pub fn demangle(writer: &mut Writer, s: &str) -> IoResult<()> { } }) - ) + } + // see src/librustc/back/link.rs for these mappings demangle! ( "$SP$" => "@", diff --git a/src/libstd/sys/common/thread_info.rs b/src/libstd/sys/common/thread_info.rs index 0519bc56f0a..dc21feb17a8 100644 --- a/src/libstd/sys/common/thread_info.rs +++ b/src/libstd/sys/common/thread_info.rs @@ -23,7 +23,7 @@ struct ThreadInfo { thread: Thread, } -thread_local!(static THREAD_INFO: RefCell<Option<ThreadInfo>> = RefCell::new(None)) +thread_local! { static THREAD_INFO: RefCell<Option<ThreadInfo>> = RefCell::new(None) } impl ThreadInfo { fn with<R>(f: |&mut ThreadInfo| -> R) -> R { |
