use crate::host;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct Panicked;
pub fn catch_panic<R, F: FnOnce() -> R>(f: F) -> Result<R, Panicked> {
let function = Box::new(f);
let raw_function = Box::<F>::into_raw(function) as usize;
let raw_result =
unsafe { host::api::trap::catch(re_entry::<R, F> as usize, raw_function) } as *mut R;
if raw_result.is_null() {
Err(Panicked)
} else {
Ok(*unsafe { Box::<R>::from_raw(raw_result) })
}
}
fn re_entry<R, F: FnOnce() -> R>(pointer: usize) -> usize {
let function = unsafe { Box::<F>::from_raw(pointer as *mut F) };
let result = function();
let result = Box::new(result);
Box::<R>::into_raw(result) as usize
}