Rollup merge of #141505 - RalfJung:catch_unwind, r=Noratrieb
rename internal panicking::try to catch_unwind The public function is called `catch_unwind`, the intrinsic at some point got renamed to `catch_unwind` -- there's no reason to have the internal implementation of this still be called `try`, so let's rename it to match the rest.
This commit is contained in:
@@ -356,7 +356,7 @@ pub use core::panic::abort_unwind;
|
|||||||
/// ```
|
/// ```
|
||||||
#[stable(feature = "catch_unwind", since = "1.9.0")]
|
#[stable(feature = "catch_unwind", since = "1.9.0")]
|
||||||
pub fn catch_unwind<F: FnOnce() -> R + UnwindSafe, R>(f: F) -> Result<R> {
|
pub fn catch_unwind<F: FnOnce() -> R + UnwindSafe, R>(f: F) -> Result<R> {
|
||||||
unsafe { panicking::r#try(f) }
|
unsafe { panicking::catch_unwind(f) }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Triggers a panic without invoking the panic hook.
|
/// Triggers a panic without invoking the panic hook.
|
||||||
|
|||||||
@@ -499,13 +499,13 @@ pub use realstd::rt::panic_count;
|
|||||||
|
|
||||||
/// Invoke a closure, capturing the cause of an unwinding panic if one occurs.
|
/// Invoke a closure, capturing the cause of an unwinding panic if one occurs.
|
||||||
#[cfg(feature = "panic_immediate_abort")]
|
#[cfg(feature = "panic_immediate_abort")]
|
||||||
pub unsafe fn r#try<R, F: FnOnce() -> R>(f: F) -> Result<R, Box<dyn Any + Send>> {
|
pub unsafe fn catch_unwind<R, F: FnOnce() -> R>(f: F) -> Result<R, Box<dyn Any + Send>> {
|
||||||
Ok(f())
|
Ok(f())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Invoke a closure, capturing the cause of an unwinding panic if one occurs.
|
/// Invoke a closure, capturing the cause of an unwinding panic if one occurs.
|
||||||
#[cfg(not(feature = "panic_immediate_abort"))]
|
#[cfg(not(feature = "panic_immediate_abort"))]
|
||||||
pub unsafe fn r#try<R, F: FnOnce() -> R>(f: F) -> Result<R, Box<dyn Any + Send>> {
|
pub unsafe fn catch_unwind<R, F: FnOnce() -> R>(f: F) -> Result<R, Box<dyn Any + Send>> {
|
||||||
union Data<F, R> {
|
union Data<F, R> {
|
||||||
f: ManuallyDrop<F>,
|
f: ManuallyDrop<F>,
|
||||||
r: ManuallyDrop<R>,
|
r: ManuallyDrop<R>,
|
||||||
@@ -541,7 +541,7 @@ pub unsafe fn r#try<R, F: FnOnce() -> R>(f: F) -> Result<R, Box<dyn Any + Send>>
|
|||||||
let data_ptr = (&raw mut data) as *mut u8;
|
let data_ptr = (&raw mut data) as *mut u8;
|
||||||
// SAFETY:
|
// SAFETY:
|
||||||
//
|
//
|
||||||
// Access to the union's fields: this is `std` and we know that the `r#try`
|
// Access to the union's fields: this is `std` and we know that the `catch_unwind`
|
||||||
// intrinsic fills in the `r` or `p` union field based on its return value.
|
// intrinsic fills in the `r` or `p` union field based on its return value.
|
||||||
//
|
//
|
||||||
// The call to `intrinsics::catch_unwind` is made safe by:
|
// The call to `intrinsics::catch_unwind` is made safe by:
|
||||||
@@ -602,7 +602,7 @@ pub unsafe fn r#try<R, F: FnOnce() -> R>(f: F) -> Result<R, Box<dyn Any + Send>>
|
|||||||
// This function cannot be marked as `unsafe` because `intrinsics::catch_unwind`
|
// This function cannot be marked as `unsafe` because `intrinsics::catch_unwind`
|
||||||
// expects normal function pointers.
|
// expects normal function pointers.
|
||||||
#[inline]
|
#[inline]
|
||||||
#[rustc_nounwind] // `intrinsic::r#try` requires catch fn to be nounwind
|
#[rustc_nounwind] // `intrinsic::catch_unwind` requires catch fn to be nounwind
|
||||||
fn do_catch<F: FnOnce() -> R, R>(data: *mut u8, payload: *mut u8) {
|
fn do_catch<F: FnOnce() -> R, R>(data: *mut u8, payload: *mut u8) {
|
||||||
// SAFETY: this is the responsibility of the caller, see above.
|
// SAFETY: this is the responsibility of the caller, see above.
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
|
|||||||
interp_ok(())
|
interp_ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Handles the `try` intrinsic, the underlying implementation of `std::panicking::try`.
|
/// Handles the `catch_unwind` intrinsic.
|
||||||
fn handle_catch_unwind(
|
fn handle_catch_unwind(
|
||||||
&mut self,
|
&mut self,
|
||||||
args: &[OpTy<'tcx>],
|
args: &[OpTy<'tcx>],
|
||||||
@@ -66,7 +66,7 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
|
|||||||
let this = self.eval_context_mut();
|
let this = self.eval_context_mut();
|
||||||
|
|
||||||
// Signature:
|
// Signature:
|
||||||
// fn r#try(try_fn: fn(*mut u8), data: *mut u8, catch_fn: fn(*mut u8, *mut u8)) -> i32
|
// fn catch_unwind(try_fn: fn(*mut u8), data: *mut u8, catch_fn: fn(*mut u8, *mut u8)) -> i32
|
||||||
// Calls `try_fn` with `data` as argument. If that executes normally, returns 0.
|
// Calls `try_fn` with `data` as argument. If that executes normally, returns 0.
|
||||||
// If that unwinds, calls `catch_fn` with the first argument being `data` and
|
// If that unwinds, calls `catch_fn` with the first argument being `data` and
|
||||||
// then second argument being a target-dependent `payload` (i.e. it is up to us to define
|
// then second argument being a target-dependent `payload` (i.e. it is up to us to define
|
||||||
@@ -120,14 +120,14 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
|
|||||||
// We only care about `catch_panic` if we're unwinding - if we're doing a normal
|
// We only care about `catch_panic` if we're unwinding - if we're doing a normal
|
||||||
// return, then we don't need to do anything special.
|
// return, then we don't need to do anything special.
|
||||||
if let (true, Some(catch_unwind)) = (unwinding, extra.catch_unwind.take()) {
|
if let (true, Some(catch_unwind)) = (unwinding, extra.catch_unwind.take()) {
|
||||||
// We've just popped a frame that was pushed by `try`,
|
// We've just popped a frame that was pushed by `catch_unwind`,
|
||||||
// and we are unwinding, so we should catch that.
|
// and we are unwinding, so we should catch that.
|
||||||
trace!(
|
trace!(
|
||||||
"unwinding: found catch_panic frame during unwinding: {:?}",
|
"unwinding: found catch_panic frame during unwinding: {:?}",
|
||||||
this.frame().instance()
|
this.frame().instance()
|
||||||
);
|
);
|
||||||
|
|
||||||
// We set the return value of `try` to 1, since there was a panic.
|
// We set the return value of `catch_unwind` to 1, since there was a panic.
|
||||||
this.write_scalar(Scalar::from_i32(1), &catch_unwind.dest)?;
|
this.write_scalar(Scalar::from_i32(1), &catch_unwind.dest)?;
|
||||||
|
|
||||||
// The Thread's `panic_payload` holds what was passed to `miri_start_unwind`.
|
// The Thread's `panic_payload` holds what was passed to `miri_start_unwind`.
|
||||||
@@ -142,7 +142,7 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
|
|||||||
ExternAbi::Rust,
|
ExternAbi::Rust,
|
||||||
&[catch_unwind.data, payload],
|
&[catch_unwind.data, payload],
|
||||||
None,
|
None,
|
||||||
// Directly return to caller of `try`.
|
// Directly return to caller of `catch_unwind`.
|
||||||
StackPopCleanup::Goto {
|
StackPopCleanup::Goto {
|
||||||
ret: catch_unwind.ret,
|
ret: catch_unwind.ret,
|
||||||
// `catch_fn` must not unwind.
|
// `catch_fn` must not unwind.
|
||||||
|
|||||||
@@ -13,8 +13,8 @@ LL | std::panic::catch_unwind(|| unwind()).unwrap_err();
|
|||||||
= help: see https://doc.rust-lang.org/nightly/reference/behavior-considered-undefined.html for further information
|
= help: see https://doc.rust-lang.org/nightly/reference/behavior-considered-undefined.html for further information
|
||||||
= note: BACKTRACE:
|
= note: BACKTRACE:
|
||||||
= note: inside closure at tests/fail/panic/bad_unwind.rs:LL:CC
|
= note: inside closure at tests/fail/panic/bad_unwind.rs:LL:CC
|
||||||
= note: inside `std::panicking::r#try::do_call::<{closure@tests/fail/panic/bad_unwind.rs:LL:CC}, ()>` at RUSTLIB/std/src/panicking.rs:LL:CC
|
= note: inside `std::panicking::catch_unwind::do_call::<{closure@tests/fail/panic/bad_unwind.rs:LL:CC}, ()>` at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||||
= note: inside `std::panicking::r#try::<(), {closure@tests/fail/panic/bad_unwind.rs:LL:CC}>` at RUSTLIB/std/src/panicking.rs:LL:CC
|
= note: inside `std::panicking::catch_unwind::<(), {closure@tests/fail/panic/bad_unwind.rs:LL:CC}>` at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||||
= note: inside `std::panic::catch_unwind::<{closure@tests/fail/panic/bad_unwind.rs:LL:CC}, ()>` at RUSTLIB/std/src/panic.rs:LL:CC
|
= note: inside `std::panic::catch_unwind::<{closure@tests/fail/panic/bad_unwind.rs:LL:CC}, ()>` at RUSTLIB/std/src/panic.rs:LL:CC
|
||||||
note: inside `main`
|
note: inside `main`
|
||||||
--> tests/fail/panic/bad_unwind.rs:LL:CC
|
--> tests/fail/panic/bad_unwind.rs:LL:CC
|
||||||
|
|||||||
@@ -11,12 +11,12 @@ LL | extern "rust-call" fn call_once(self, args: Args) -> Self::Output;
|
|||||||
= note: inside `std::sys::backtrace::__rust_begin_short_backtrace::<fn(), ()>` at RUSTLIB/std/src/sys/backtrace.rs:LL:CC
|
= note: inside `std::sys::backtrace::__rust_begin_short_backtrace::<fn(), ()>` at RUSTLIB/std/src/sys/backtrace.rs:LL:CC
|
||||||
= note: inside closure at RUSTLIB/std/src/rt.rs:LL:CC
|
= note: inside closure at RUSTLIB/std/src/rt.rs:LL:CC
|
||||||
= note: inside `std::ops::function::impls::<impl std::ops::FnOnce<()> for &dyn std::ops::Fn() -> i32 + std::marker::Sync + std::panic::RefUnwindSafe>::call_once` at RUSTLIB/core/src/ops/function.rs:LL:CC
|
= note: inside `std::ops::function::impls::<impl std::ops::FnOnce<()> for &dyn std::ops::Fn() -> i32 + std::marker::Sync + std::panic::RefUnwindSafe>::call_once` at RUSTLIB/core/src/ops/function.rs:LL:CC
|
||||||
= note: inside `std::panicking::r#try::do_call::<&dyn std::ops::Fn() -> i32 + std::marker::Sync + std::panic::RefUnwindSafe, i32>` at RUSTLIB/std/src/panicking.rs:LL:CC
|
= note: inside `std::panicking::catch_unwind::do_call::<&dyn std::ops::Fn() -> i32 + std::marker::Sync + std::panic::RefUnwindSafe, i32>` at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||||
= note: inside `std::panicking::r#try::<i32, &dyn std::ops::Fn() -> i32 + std::marker::Sync + std::panic::RefUnwindSafe>` at RUSTLIB/std/src/panicking.rs:LL:CC
|
= note: inside `std::panicking::catch_unwind::<i32, &dyn std::ops::Fn() -> i32 + std::marker::Sync + std::panic::RefUnwindSafe>` at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||||
= note: inside `std::panic::catch_unwind::<&dyn std::ops::Fn() -> i32 + std::marker::Sync + std::panic::RefUnwindSafe, i32>` at RUSTLIB/std/src/panic.rs:LL:CC
|
= note: inside `std::panic::catch_unwind::<&dyn std::ops::Fn() -> i32 + std::marker::Sync + std::panic::RefUnwindSafe, i32>` at RUSTLIB/std/src/panic.rs:LL:CC
|
||||||
= note: inside closure at RUSTLIB/std/src/rt.rs:LL:CC
|
= note: inside closure at RUSTLIB/std/src/rt.rs:LL:CC
|
||||||
= note: inside `std::panicking::r#try::do_call::<{closure@std::rt::lang_start_internal::{closure#0}}, isize>` at RUSTLIB/std/src/panicking.rs:LL:CC
|
= note: inside `std::panicking::catch_unwind::do_call::<{closure@std::rt::lang_start_internal::{closure#0}}, isize>` at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||||
= note: inside `std::panicking::r#try::<isize, {closure@std::rt::lang_start_internal::{closure#0}}>` at RUSTLIB/std/src/panicking.rs:LL:CC
|
= note: inside `std::panicking::catch_unwind::<isize, {closure@std::rt::lang_start_internal::{closure#0}}>` at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||||
= note: inside `std::panic::catch_unwind::<{closure@std::rt::lang_start_internal::{closure#0}}, isize>` at RUSTLIB/std/src/panic.rs:LL:CC
|
= note: inside `std::panic::catch_unwind::<{closure@std::rt::lang_start_internal::{closure#0}}, isize>` at RUSTLIB/std/src/panic.rs:LL:CC
|
||||||
= note: inside `std::rt::lang_start_internal` at RUSTLIB/std/src/rt.rs:LL:CC
|
= note: inside `std::rt::lang_start_internal` at RUSTLIB/std/src/rt.rs:LL:CC
|
||||||
= note: inside `std::rt::lang_start::<()>` at RUSTLIB/std/src/rt.rs:LL:CC
|
= note: inside `std::rt::lang_start::<()>` at RUSTLIB/std/src/rt.rs:LL:CC
|
||||||
|
|||||||
@@ -7,12 +7,12 @@ RUSTLIB/core/src/ops/function.rs:LL:CC (<fn() as std::ops::FnOnce<()>>::call_onc
|
|||||||
RUSTLIB/std/src/sys/backtrace.rs:LL:CC (std::sys::backtrace::__rust_begin_short_backtrace)
|
RUSTLIB/std/src/sys/backtrace.rs:LL:CC (std::sys::backtrace::__rust_begin_short_backtrace)
|
||||||
RUSTLIB/std/src/rt.rs:LL:CC (std::rt::lang_start::{closure#0})
|
RUSTLIB/std/src/rt.rs:LL:CC (std::rt::lang_start::{closure#0})
|
||||||
RUSTLIB/core/src/ops/function.rs:LL:CC (std::ops::function::impls::call_once)
|
RUSTLIB/core/src/ops/function.rs:LL:CC (std::ops::function::impls::call_once)
|
||||||
RUSTLIB/std/src/panicking.rs:LL:CC (std::panicking::r#try::do_call)
|
RUSTLIB/std/src/panicking.rs:LL:CC (std::panicking::catch_unwind::do_call)
|
||||||
RUSTLIB/std/src/panicking.rs:LL:CC (std::panicking::r#try)
|
RUSTLIB/std/src/panicking.rs:LL:CC (std::panicking::catch_unwind)
|
||||||
RUSTLIB/std/src/panic.rs:LL:CC (std::panic::catch_unwind)
|
RUSTLIB/std/src/panic.rs:LL:CC (std::panic::catch_unwind)
|
||||||
RUSTLIB/std/src/rt.rs:LL:CC (std::rt::lang_start_internal::{closure#0})
|
RUSTLIB/std/src/rt.rs:LL:CC (std::rt::lang_start_internal::{closure#0})
|
||||||
RUSTLIB/std/src/panicking.rs:LL:CC (std::panicking::r#try::do_call)
|
RUSTLIB/std/src/panicking.rs:LL:CC (std::panicking::catch_unwind::do_call)
|
||||||
RUSTLIB/std/src/panicking.rs:LL:CC (std::panicking::r#try)
|
RUSTLIB/std/src/panicking.rs:LL:CC (std::panicking::catch_unwind)
|
||||||
RUSTLIB/std/src/panic.rs:LL:CC (std::panic::catch_unwind)
|
RUSTLIB/std/src/panic.rs:LL:CC (std::panic::catch_unwind)
|
||||||
RUSTLIB/std/src/rt.rs:LL:CC (std::rt::lang_start_internal)
|
RUSTLIB/std/src/rt.rs:LL:CC (std::rt::lang_start_internal)
|
||||||
RUSTLIB/std/src/rt.rs:LL:CC (std::rt::lang_start)
|
RUSTLIB/std/src/rt.rs:LL:CC (std::rt::lang_start)
|
||||||
|
|||||||
@@ -8,17 +8,17 @@
|
|||||||
at RUSTLIB/std/src/rt.rs:LL:CC
|
at RUSTLIB/std/src/rt.rs:LL:CC
|
||||||
4: std::ops::function::impls::call_once
|
4: std::ops::function::impls::call_once
|
||||||
at RUSTLIB/core/src/ops/function.rs:LL:CC
|
at RUSTLIB/core/src/ops/function.rs:LL:CC
|
||||||
5: std::panicking::r#try::do_call
|
5: std::panicking::catch_unwind::do_call
|
||||||
at RUSTLIB/std/src/panicking.rs:LL:CC
|
at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||||
6: std::panicking::r#try
|
6: std::panicking::catch_unwind
|
||||||
at RUSTLIB/std/src/panicking.rs:LL:CC
|
at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||||
7: std::panic::catch_unwind
|
7: std::panic::catch_unwind
|
||||||
at RUSTLIB/std/src/panic.rs:LL:CC
|
at RUSTLIB/std/src/panic.rs:LL:CC
|
||||||
8: std::rt::lang_start_internal::{closure#0}
|
8: std::rt::lang_start_internal::{closure#0}
|
||||||
at RUSTLIB/std/src/rt.rs:LL:CC
|
at RUSTLIB/std/src/rt.rs:LL:CC
|
||||||
9: std::panicking::r#try::do_call
|
9: std::panicking::catch_unwind::do_call
|
||||||
at RUSTLIB/std/src/panicking.rs:LL:CC
|
at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||||
10: std::panicking::r#try
|
10: std::panicking::catch_unwind
|
||||||
at RUSTLIB/std/src/panicking.rs:LL:CC
|
at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||||
11: std::panic::catch_unwind
|
11: std::panic::catch_unwind
|
||||||
at RUSTLIB/std/src/panic.rs:LL:CC
|
at RUSTLIB/std/src/panic.rs:LL:CC
|
||||||
|
|||||||
@@ -16,17 +16,17 @@
|
|||||||
at RUSTLIB/std/src/rt.rs:LL:CC
|
at RUSTLIB/std/src/rt.rs:LL:CC
|
||||||
8: std::ops::function::impls::call_once
|
8: std::ops::function::impls::call_once
|
||||||
at RUSTLIB/core/src/ops/function.rs:LL:CC
|
at RUSTLIB/core/src/ops/function.rs:LL:CC
|
||||||
9: std::panicking::r#try::do_call
|
9: std::panicking::catch_unwind::do_call
|
||||||
at RUSTLIB/std/src/panicking.rs:LL:CC
|
at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||||
10: std::panicking::r#try
|
10: std::panicking::catch_unwind
|
||||||
at RUSTLIB/std/src/panicking.rs:LL:CC
|
at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||||
11: std::panic::catch_unwind
|
11: std::panic::catch_unwind
|
||||||
at RUSTLIB/std/src/panic.rs:LL:CC
|
at RUSTLIB/std/src/panic.rs:LL:CC
|
||||||
12: std::rt::lang_start_internal::{closure#0}
|
12: std::rt::lang_start_internal::{closure#0}
|
||||||
at RUSTLIB/std/src/rt.rs:LL:CC
|
at RUSTLIB/std/src/rt.rs:LL:CC
|
||||||
13: std::panicking::r#try::do_call
|
13: std::panicking::catch_unwind::do_call
|
||||||
at RUSTLIB/std/src/panicking.rs:LL:CC
|
at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||||
14: std::panicking::r#try
|
14: std::panicking::catch_unwind
|
||||||
at RUSTLIB/std/src/panicking.rs:LL:CC
|
at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||||
15: std::panic::catch_unwind
|
15: std::panic::catch_unwind
|
||||||
at RUSTLIB/std/src/panic.rs:LL:CC
|
at RUSTLIB/std/src/panic.rs:LL:CC
|
||||||
|
|||||||
Reference in New Issue
Block a user