Add PanicInfo::can_unwind which indicates whether a panic handler is
allowed to trigger unwinding.
This commit is contained in:
parent
bd3cb52565
commit
528c4f9158
4 changed files with 31 additions and 10 deletions
|
@ -31,6 +31,7 @@ pub struct PanicInfo<'a> {
|
|||
payload: &'a (dyn Any + Send),
|
||||
message: Option<&'a fmt::Arguments<'a>>,
|
||||
location: &'a Location<'a>,
|
||||
can_unwind: bool,
|
||||
}
|
||||
|
||||
impl<'a> PanicInfo<'a> {
|
||||
|
@ -44,9 +45,10 @@ impl<'a> PanicInfo<'a> {
|
|||
pub fn internal_constructor(
|
||||
message: Option<&'a fmt::Arguments<'a>>,
|
||||
location: &'a Location<'a>,
|
||||
can_unwind: bool,
|
||||
) -> Self {
|
||||
struct NoPayload;
|
||||
PanicInfo { location, message, payload: &NoPayload }
|
||||
PanicInfo { location, message, payload: &NoPayload, can_unwind }
|
||||
}
|
||||
|
||||
#[unstable(
|
||||
|
@ -127,6 +129,18 @@ impl<'a> PanicInfo<'a> {
|
|||
// deal with that case in std::panicking::default_hook and core::panicking::panic_fmt.
|
||||
Some(&self.location)
|
||||
}
|
||||
|
||||
/// Returns whether the panic handler is allowed to unwind the stack from
|
||||
/// the point where the panic occurred.
|
||||
///
|
||||
/// This is true for most kinds of panics with the exception of panics
|
||||
/// caused by trying to unwind out of a `Drop` implementation or a function
|
||||
/// whose ABI does not support unwinding.
|
||||
#[must_use]
|
||||
#[unstable(feature = "panic_can_unwind", issue = "92988")]
|
||||
pub fn can_unwind(&self) -> bool {
|
||||
self.can_unwind
|
||||
}
|
||||
}
|
||||
|
||||
#[stable(feature = "panic_hook_display", since = "1.26.0")]
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue