Skip to content

Commit

Permalink
Remove std::panic::PanicInfo::internal_constructor+set_payload.
Browse files Browse the repository at this point in the history
We can just set the payload immediately in the constructor,
and the constructor does not need to be public.
  • Loading branch information
m-ou-se committed Jun 11, 2024
1 parent 701d6a2 commit 47f359b
Show file tree
Hide file tree
Showing 2 changed files with 7 additions and 21 deletions.
15 changes: 3 additions & 12 deletions std/src/panic.rs
Original file line number Diff line number Diff line change
Expand Up @@ -44,23 +44,14 @@ pub struct PanicInfo<'a> {
}

impl<'a> PanicInfo<'a> {
#[unstable(feature = "panic_internals", issue = "none")]
#[doc(hidden)]
#[inline]
pub fn internal_constructor(
pub(crate) fn new(
location: &'a Location<'a>,
payload: &'a (dyn Any + Send),
can_unwind: bool,
force_no_backtrace: bool,
) -> Self {
struct NoPayload;
PanicInfo { payload: &NoPayload, location, can_unwind, force_no_backtrace }
}

#[unstable(feature = "panic_internals", issue = "none")]
#[doc(hidden)]
#[inline]
pub fn set_payload(&mut self, info: &'a (dyn Any + Send)) {
self.payload = info;
PanicInfo { payload, location, can_unwind, force_no_backtrace }
}

/// Returns the payload associated with the panic.
Expand Down
13 changes: 4 additions & 9 deletions std/src/panicking.rs
Original file line number Diff line number Diff line change
Expand Up @@ -775,9 +775,7 @@ fn rust_panic_with_hook(
crate::sys::abort_internal();
}

let mut info = PanicInfo::internal_constructor(location, can_unwind, force_no_backtrace);
let hook = HOOK.read().unwrap_or_else(PoisonError::into_inner);
match *hook {
match *HOOK.read().unwrap_or_else(PoisonError::into_inner) {
// Some platforms (like wasm) know that printing to stderr won't ever actually
// print anything, and if that's the case we can skip the default
// hook. Since string formatting happens lazily when calling `payload`
Expand All @@ -786,15 +784,12 @@ fn rust_panic_with_hook(
// formatting.)
Hook::Default if panic_output().is_none() => {}
Hook::Default => {
info.set_payload(payload.get());
default_hook(&info);
default_hook(&PanicInfo::new(location, payload.get(), can_unwind, force_no_backtrace));
}
Hook::Custom(ref hook) => {
info.set_payload(payload.get());
hook(&info);
hook(&PanicInfo::new(location, payload.get(), can_unwind, force_no_backtrace));
}
};
drop(hook);
}

// Indicate that we have finished executing the panic hook. After this point
// it is fine if there is a panic while executing destructors, as long as it
Expand Down

0 comments on commit 47f359b

Please sign in to comment.