use a single large catch_unwind in lang_start
This commit is contained in:
parent
7e4077d06f
commit
9f7fe81d53
5 changed files with 56 additions and 24 deletions
|
@ -67,7 +67,7 @@ macro_rules! rtunwrap {
|
|||
};
|
||||
}
|
||||
|
||||
fn handle_rt_panic(e: Box<dyn Any + Send>) {
|
||||
fn handle_rt_panic<T>(e: Box<dyn Any + Send>) -> T {
|
||||
mem::forget(e);
|
||||
rtabort!("initialization or cleanup bug");
|
||||
}
|
||||
|
@ -168,19 +168,27 @@ fn lang_start_internal(
|
|||
// panic is a std implementation bug. A quite likely one too, as there isn't any way to
|
||||
// prevent std from accidentally introducing a panic to these functions. Another is from
|
||||
// user code from `main` or, more nefariously, as described in e.g. issue #86030.
|
||||
// SAFETY: Only called once during runtime initialization.
|
||||
panic::catch_unwind(move || unsafe { init(argc, argv, sigpipe) })
|
||||
.unwrap_or_else(handle_rt_panic);
|
||||
let ret_code = panic::catch_unwind(move || panic::catch_unwind(main).unwrap_or(101) as isize)
|
||||
.map_err(move |e| {
|
||||
mem::forget(e);
|
||||
rtabort!("drop of the panic payload panicked");
|
||||
});
|
||||
panic::catch_unwind(cleanup).unwrap_or_else(handle_rt_panic);
|
||||
// Guard against multiple threads calling `libc::exit` concurrently.
|
||||
// See the documentation for `unique_thread_exit` for more information.
|
||||
panic::catch_unwind(crate::sys::exit_guard::unique_thread_exit).unwrap_or_else(handle_rt_panic);
|
||||
ret_code
|
||||
//
|
||||
// We use `catch_unwind` with `handle_rt_panic` instead of `abort_unwind` to make the error in
|
||||
// case of a panic a bit nicer.
|
||||
panic::catch_unwind(move || {
|
||||
// SAFETY: Only called once during runtime initialization.
|
||||
unsafe { init(argc, argv, sigpipe) };
|
||||
let ret_code =
|
||||
panic::catch_unwind(move || panic::catch_unwind(main).unwrap_or(101) as isize).map_err(
|
||||
move |e| {
|
||||
// Print a specific error when we abort due to a panicing payload destructor.
|
||||
mem::forget(e);
|
||||
rtabort!("drop of the panic payload panicked");
|
||||
},
|
||||
);
|
||||
cleanup();
|
||||
// Guard against multiple threads calling `libc::exit` concurrently.
|
||||
// See the documentation for `unique_thread_exit` for more information.
|
||||
crate::sys::exit_guard::unique_thread_exit();
|
||||
ret_code
|
||||
})
|
||||
.unwrap_or_else(handle_rt_panic)
|
||||
}
|
||||
|
||||
#[cfg(not(any(test, doctest)))]
|
||||
|
|
|
@ -15,9 +15,13 @@ LL | extern "rust-call" fn call_once(self, args: Args) -> Self::Output;
|
|||
= 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::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 `std::panicking::r#try::do_call::<{closure@std::rt::lang_start_internal::{closure#1}}, isize>` at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||
= note: inside `std::panicking::r#try::<isize, {closure@std::rt::lang_start_internal::{closure#1}}>` at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||
= note: inside `std::panic::catch_unwind::<{closure@std::rt::lang_start_internal::{closure#1}}, isize>` at RUSTLIB/std/src/panic.rs:LL:CC
|
||||
= note: inside `std::panicking::r#try::do_call::<{closure@std::rt::lang_start_internal::{closure#0}::{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}::{closure#0}}>` at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||
= note: inside `std::panic::catch_unwind::<{closure@std::rt::lang_start_internal::{closure#0}::{closure#0}}, isize>` at RUSTLIB/std/src/panic.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}}, std::result::Result<isize, !>>` at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||
= note: inside `std::panicking::r#try::<std::result::Result<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}}, std::result::Result<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::<()>` at RUSTLIB/std/src/rt.rs:LL:CC
|
||||
|
||||
|
|
|
@ -10,7 +10,11 @@ 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::r#try)
|
||||
RUSTLIB/std/src/panic.rs:LL:CC (std::panic::catch_unwind)
|
||||
RUSTLIB/std/src/rt.rs:LL:CC (std::rt::lang_start_internal::{closure#1})
|
||||
RUSTLIB/std/src/rt.rs:LL:CC (std::rt::lang_start_internal::{closure#0}::{closure#0})
|
||||
RUSTLIB/std/src/panicking.rs:LL:CC (std::panicking::r#try::do_call)
|
||||
RUSTLIB/std/src/panicking.rs:LL:CC (std::panicking::r#try)
|
||||
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/panicking.rs:LL:CC (std::panicking::r#try::do_call)
|
||||
RUSTLIB/std/src/panicking.rs:LL:CC (std::panicking::r#try)
|
||||
RUSTLIB/std/src/panic.rs:LL:CC (std::panic::catch_unwind)
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||
7: std::panic::catch_unwind
|
||||
at RUSTLIB/std/src/panic.rs:LL:CC
|
||||
8: std::rt::lang_start_internal::{closure#1}
|
||||
8: std::rt::lang_start_internal::{closure#0}::{closure#0}
|
||||
at RUSTLIB/std/src/rt.rs:LL:CC
|
||||
9: std::panicking::r#try::do_call
|
||||
at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||
|
@ -22,7 +22,15 @@
|
|||
at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||
11: std::panic::catch_unwind
|
||||
at RUSTLIB/std/src/panic.rs:LL:CC
|
||||
12: std::rt::lang_start_internal
|
||||
12: std::rt::lang_start_internal::{closure#0}
|
||||
at RUSTLIB/std/src/rt.rs:LL:CC
|
||||
13: std::rt::lang_start
|
||||
13: std::panicking::r#try::do_call
|
||||
at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||
14: std::panicking::r#try
|
||||
at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||
15: std::panic::catch_unwind
|
||||
at RUSTLIB/std/src/panic.rs:LL:CC
|
||||
16: std::rt::lang_start_internal
|
||||
at RUSTLIB/std/src/rt.rs:LL:CC
|
||||
17: std::rt::lang_start
|
||||
at RUSTLIB/std/src/rt.rs:LL:CC
|
||||
|
|
|
@ -22,7 +22,7 @@
|
|||
at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||
11: std::panic::catch_unwind
|
||||
at RUSTLIB/std/src/panic.rs:LL:CC
|
||||
12: std::rt::lang_start_internal::{closure#1}
|
||||
12: std::rt::lang_start_internal::{closure#0}::{closure#0}
|
||||
at RUSTLIB/std/src/rt.rs:LL:CC
|
||||
13: std::panicking::r#try::do_call
|
||||
at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||
|
@ -30,7 +30,15 @@
|
|||
at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||
15: std::panic::catch_unwind
|
||||
at RUSTLIB/std/src/panic.rs:LL:CC
|
||||
16: std::rt::lang_start_internal
|
||||
16: std::rt::lang_start_internal::{closure#0}
|
||||
at RUSTLIB/std/src/rt.rs:LL:CC
|
||||
17: std::rt::lang_start
|
||||
17: std::panicking::r#try::do_call
|
||||
at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||
18: std::panicking::r#try
|
||||
at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||
19: std::panic::catch_unwind
|
||||
at RUSTLIB/std/src/panic.rs:LL:CC
|
||||
20: std::rt::lang_start_internal
|
||||
at RUSTLIB/std/src/rt.rs:LL:CC
|
||||
21: std::rt::lang_start
|
||||
at RUSTLIB/std/src/rt.rs:LL:CC
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue