#[track_caller]
#[inline(always)]
pub fn abort() -> ! { core::intrinsics::abort() }
#[track_caller]
pub fn error<S: AsRef<str>>(text: S) -> ! {
#[cfg(not(playdate))]
{
use core::sync::atomic::AtomicBool;
use core::sync::atomic::Ordering;
#[no_mangle]
static END_WITH_ERR: AtomicBool = AtomicBool::new(false);
END_WITH_ERR.store(true, Ordering::Relaxed);
}
if let Some(f) = unsafe { (*(*crate::sys::API).system).error } {
let f: unsafe extern "C" fn(*const core::ffi::c_char, ...) = f;
let p =
core::ptr::addr_of!(f) as *const _ as *const unsafe extern "C" fn(*const core::ffi::c_char, ...) -> !;
let f = unsafe { p.as_ref() }.unwrap();
if let Ok(s) = alloc::ffi::CString::new(text.as_ref()) {
unsafe { f(s.as_ptr() as _) }
} else {
unsafe { f(text.as_ref().as_ptr() as _) }
}
} else {
abort()
}
}