summary refs log tree commit diff
path: root/src/libstd
diff options
context:
space:
mode:
authorVadim Petrochenkov <vadim.petrochenkov@gmail.com>2017-02-23 21:25:23 +0300
committerYamakaky <yamakaky@gmail.com>2017-02-23 13:25:23 -0500
commit227eab0b7f457def8553a60fdb0ef4a051f39957 (patch)
tree589f8ea0204ecf3c1f924203f64be079c77318ee /src/libstd
parentd50e4cc0640e54a64d0f7ccb05a77fd4a2fe0741 (diff)
downloadrust-227eab0b7f457def8553a60fdb0ef4a051f39957.tar.gz
rust-227eab0b7f457def8553a60fdb0ef4a051f39957.zip
Fix tests on Windows (#1)
Diffstat (limited to 'src/libstd')
-rw-r--r--src/libstd/sys_common/backtrace.rs96
1 files changed, 56 insertions, 40 deletions
diff --git a/src/libstd/sys_common/backtrace.rs b/src/libstd/sys_common/backtrace.rs
index a19f7954e8f..74a9893d4bd 100644
--- a/src/libstd/sys_common/backtrace.rs
+++ b/src/libstd/sys_common/backtrace.rs
@@ -71,7 +71,7 @@ fn _print(w: &mut Write, format: PrintFormat) -> io::Result<()> {
     let (nb_frames, context) = unwind_backtrace(&mut frames)?;
     let (skipped_before, skipped_after) =
         filter_frames(&frames[..nb_frames], format, &context);
-    if format == PrintFormat::Short {
+    if skipped_before + skipped_after > 0 {
         writeln!(w, "note: Some details are omitted, \
                      run with `RUST_BACKTRACE=full` for a verbose backtrace.")?;
     }
@@ -101,50 +101,66 @@ fn filter_frames(frames: &[Frame],
         return (0, 0);
     }
 
-    let mut skipped_before = 0;
-    for (i, frame) in frames.iter().enumerate() {
-        skipped_before = i;
-        let mut skip = false;
-
-        let _ = resolve_symname(*frame, |symname| {
+    // We want to filter out frames with some prefixes
+    // from both top and bottom of the call stack.
+    static BAD_PREFIXES_TOP: &'static [&'static str] = &[
+        "_ZN3std3sys3imp9backtrace",
+        "ZN3std3sys3imp9backtrace",
+        "_ZN3std10sys_common9backtrace",
+        "ZN3std10sys_common9backtrace",
+        "_ZN3std9panicking",
+        "ZN3std9panicking",
+        "std::panicking",
+        "_ZN4core9panicking",
+        "ZN4core9panicking",
+        "core::panicking",
+        "_ZN4core6result13unwrap_failed",
+        "ZN4core6result13unwrap_failed",
+        "rust_begin_unwind",
+        "_ZN4drop",
+        "mingw_set_invalid_parameter_handler",
+    ];
+    static BAD_PREFIXES_BOTTOM: &'static [&'static str] = &[
+        "_ZN3std9panicking",
+        "ZN3std9panicking",
+        "std::panicking",
+        "_ZN4core9panicking",
+        "ZN4core9panicking",
+        "core::panicking",
+        "_ZN3std2rt10lang_start",
+        "ZN3std2rt10lang_start",
+        "__rust_maybe_catch_panic",
+        "_rust_maybe_catch_panic",
+        "__libc_start_main",
+        "__rust_try",
+        "_start",
+        "BaseThreadInitThunk",
+        "__scrt_common_main_seh",
+        "_ZN4drop",
+        "mingw_set_invalid_parameter_handler",
+    ];
+
+    let is_good_frame = |frame: Frame, bad_prefixes: &[&str]| {
+        resolve_symname(frame, |symname| {
             if let Some(mangled_symbol_name) = symname {
-                let magics_begin = [
-                    "_ZN3std3sys3imp9backtrace",
-                    "_ZN3std10sys_common9backtrace",
-                    "_ZN3std9panicking",
-                    "_ZN4core9panicking",
-                    "rust_begin_unwind",
-                    "_ZN4core6result13unwrap_failed",
-                ];
-                if !magics_begin.iter().any(|s| mangled_symbol_name.starts_with(s)) {
-                    skip = true;
+                if !bad_prefixes.iter().any(|s| mangled_symbol_name.starts_with(s)) {
+                    return Ok(())
                 }
             }
-            Ok(())
-        }, context);
+            Err(io::Error::from(io::ErrorKind::Other))
+        }, context).is_ok()
+    };
 
-        if skip {
-            break;
-        }
-    }
+    let skipped_before = frames.iter().position(|frame| {
+        is_good_frame(*frame, BAD_PREFIXES_TOP)
+    }).unwrap_or(frames.len());
+    let skipped_after = frames[skipped_before..].iter().rposition(|frame| {
+        is_good_frame(*frame, BAD_PREFIXES_BOTTOM)
+    }).unwrap_or(frames.len() - skipped_before);
 
-    let mut skipped_after = 0;
-    for (i, frame) in frames.iter().rev().enumerate() {
-        let _ = resolve_symname(*frame, |symname| {
-            if let Some(mangled_symbol_name) = symname {
-                let magics_end = [
-                    "_ZN3std9panicking3try7do_call",
-                    "__rust_maybe_catch_panic",
-                    "__libc_start_main",
-                    "__rust_try",
-                    "_start",
-                ];
-                if magics_end.iter().any(|s| mangled_symbol_name.starts_with(s)) {
-                    skipped_after = i + 1;
-                }
-            }
-            Ok(())
-        }, context);
+    if skipped_before + skipped_after == frames.len() {
+        // Avoid showing completely empty backtraces
+        return (0, 0);
     }
 
     (skipped_before, skipped_after)