Make PanicInfo::message available for std::panic! with a formatting string.

This enables PanicInfo’s Display impl to show the panic message in those cases.
This commit is contained in:
Simon Sapin
2018-01-23 18:19:21 +01:00
parent 0e60287b41
commit f15c816932
2 changed files with 9 additions and 8 deletions

View File

@@ -130,8 +130,8 @@ impl<'a> fmt::Display for PanicInfo<'a> {
}
// NOTE: we cannot use downcast_ref::<String>() here
// since String is not available in libcore!
// A String payload and no message is what wed get from `std::panic!`
// called with multiple arguments.
// The payload is a String when `std::panic!` is called with multiple arguments,
// but in that case the message is also available.
self.location.fmt(formatter)
}

View File

@@ -344,7 +344,7 @@ pub fn begin_panic_fmt(msg: &fmt::Arguments,
let mut s = String::new();
let _ = s.write_fmt(*msg);
begin_panic(s, file_line_col)
rust_panic_with_hook(Box::new(s), Some(msg), file_line_col)
}
/// This is the entry point of panicking for panic!() and assert!().
@@ -360,7 +360,7 @@ pub fn begin_panic<M: Any + Send>(msg: M, file_line_col: &(&'static str, u32, u3
// be performed in the parent of this thread instead of the thread that's
// panicking.
rust_panic_with_hook(Box::new(msg), file_line_col)
rust_panic_with_hook(Box::new(msg), None, file_line_col)
}
/// Executes the primary logic for a panic, including checking for recursive
@@ -371,7 +371,8 @@ pub fn begin_panic<M: Any + Send>(msg: M, file_line_col: &(&'static str, u32, u3
/// run panic hooks, and then delegate to the actual implementation of panics.
#[inline(never)]
#[cold]
fn rust_panic_with_hook(msg: Box<Any + Send>,
fn rust_panic_with_hook(payload: Box<Any + Send>,
message: Option<&fmt::Arguments>,
file_line_col: &(&'static str, u32, u32)) -> ! {
let (file, line, col) = *file_line_col;
@@ -390,8 +391,8 @@ fn rust_panic_with_hook(msg: Box<Any + Send>,
unsafe {
let info = PanicInfo::internal_constructor(
&*msg,
None,
&*payload,
message,
Location::internal_constructor(file, line, col),
);
HOOK_LOCK.read();
@@ -412,7 +413,7 @@ fn rust_panic_with_hook(msg: Box<Any + Send>,
unsafe { intrinsics::abort() }
}
rust_panic(msg)
rust_panic(payload)
}
/// Shim around rust_panic. Called by resume_unwind.