#![cfg_attr(panic="abort", feature(never_type))]
#![deny(warnings)]
#![doc(test(attr(deny(warnings))))]
#![doc(test(attr(allow(dead_code))))]
#![doc(test(attr(allow(unused_variables))))]
#![cfg_attr(panic="abort", no_std)]
#[cfg(not(panic="abort"))]
extern crate core;
use core::panic::UnwindSafe;
#[cfg(not(panic="abort"))]
mod i {
use core::panic::UnwindSafe;
use std::any::Any;
pub type Error = Box<dyn Any + Send + 'static>;
pub fn error_into_raw(e: Error) -> usize {
Box::into_raw(Box::new(e)) as usize
}
pub unsafe fn error_from_raw(e: usize) -> Error {
*Box::from_raw(e as *mut Error)
}
#[inline]
pub fn panicking() -> bool {
std::thread::panicking()
}
#[inline]
pub fn catch_unwind<T>(f: impl FnOnce() -> T + UnwindSafe) -> Result<T, Error> {
std::panic::catch_unwind(f)
}
#[inline]
pub fn resume_unwind(payload: Error) -> ! {
std::panic::resume_unwind(payload)
}
}
#[cfg(panic="abort")]
mod i {
use core::hint::unreachable_unchecked;
use core::panic::UnwindSafe;
pub type Error = !;
pub fn error_into_raw(e: Error) -> usize {
e
}
pub unsafe fn error_from_raw(_: usize) -> Error {
unreachable_unchecked()
}
#[inline]
pub fn panicking() -> bool {
false
}
#[inline]
pub fn catch_unwind<T>(f: impl FnOnce() -> T + UnwindSafe) -> Result<T, Error> {
Ok(f())
}
#[inline]
pub fn resume_unwind(payload: Error) -> ! {
payload
}
}
pub struct Error(i::Error);
#[allow(unreachable_code)]
impl Error {
pub fn into_raw(self) -> usize {
i::error_into_raw(self.0)
}
pub unsafe fn from_raw(error: usize) -> Self {
Error(i::error_from_raw(error))
}
}
#[inline]
pub fn panicking() -> bool {
i::panicking()
}
#[inline]
pub fn catch_unwind<T>(f: impl FnOnce() -> T + UnwindSafe) -> Result<T, Error> {
i::catch_unwind(f).map_err(Error)
}
#[inline]
pub fn resume_unwind(payload: Error) -> ! {
#[allow(unreachable_code)]
i::resume_unwind(payload.0)
}