use alloc::boxed::Box;
use core::any::Any;
use core::panic::AssertUnwindSafe;
use std::eprintln;
use std::panic::catch_unwind;
use std::panic::resume_unwind;
use std::process::abort;
use std::thread::Result;
#[cold]
pub fn halt_unwinding<F, R>(func: F) -> Result<R>
where
F: FnOnce() -> R,
{
catch_unwind(AssertUnwindSafe(func))
}
#[cold]
pub fn resume_unwinding(payload: Box<dyn Any + Send>) -> ! {
resume_unwind(payload)
}
pub struct AbortOnDrop;
impl Drop for AbortOnDrop {
fn drop(&mut self) {
eprintln!("Forte: detected unexpected panic; aborting");
abort();
}
}