@@ -31,15 +31,12 @@ pub fn on_panic(obj: &(Any+Send), file: &'static str, line: u32) {
31
31
None => "Box<Any>" ,
32
32
}
33
33
} ;
34
- let mut err = match Stderr :: new ( ) {
35
- Ok ( err) => err,
36
- _ => return ,
37
- } ;
34
+ let mut err = Stderr :: new ( ) . ok ( ) ;
38
35
let thread = thread_info:: current_thread ( ) ;
39
36
let name = thread. as_ref ( ) . and_then ( |t| t. name ( ) ) . unwrap_or ( "<unnamed>" ) ;
40
37
let prev = LOCAL_STDERR . with ( |s| s. borrow_mut ( ) . take ( ) ) ;
41
- match prev {
42
- Some ( mut stderr) => {
38
+ match ( prev, err . as_mut ( ) ) {
39
+ ( Some ( mut stderr) , _ ) => {
43
40
// FIXME: what to do when the thread printing panics?
44
41
let _ = writeln ! ( stderr,
45
42
"thread '{}' panicked at '{}', {}:{}\n " ,
@@ -52,18 +49,22 @@ pub fn on_panic(obj: &(Any+Send), file: &'static str, line: u32) {
52
49
* slot. borrow_mut ( ) = s. take ( ) ;
53
50
} ) ;
54
51
}
55
- None => {
56
- let _ = writeln ! ( & mut err, "thread '{}' panicked at '{}', {}:{}" ,
52
+ ( None , Some ( ref mut err ) ) => {
53
+ let _ = writeln ! ( err, "thread '{}' panicked at '{}', {}:{}" ,
57
54
name, msg, file, line) ;
58
55
if backtrace:: log_enabled ( ) {
59
- let _ = backtrace:: write ( & mut err) ;
56
+ let _ = backtrace:: write ( err) ;
60
57
}
61
58
}
59
+ _ => { }
62
60
}
63
61
64
62
// If this is a double panic, make sure that we printed a backtrace
65
63
// for this panic.
66
- if unwind:: panicking ( ) && !backtrace:: log_enabled ( ) {
67
- let _ = backtrace:: write ( & mut err) ;
64
+ match err {
65
+ Some ( ref mut err) if unwind:: panicking ( ) && !backtrace:: log_enabled ( ) => {
66
+ let _ = backtrace:: write ( err) ;
67
+ }
68
+ _ => { }
68
69
}
69
70
}
0 commit comments