1#[track_caller]
6#[inline(always)]
7pub fn abort() -> ! { core::intrinsics::abort() }
8
9
10#[track_caller]
14pub fn error<S: AsRef<str>>(text: S) -> ! {
15 #[cfg(not(playdate))]
16 {
17 use core::sync::atomic::AtomicBool;
18 use core::sync::atomic::Ordering;
19
20 #[no_mangle]
26 static END_WITH_ERR: AtomicBool = AtomicBool::new(false);
27
28 END_WITH_ERR.store(true, Ordering::Relaxed);
29 }
30
31
32 if let Some(f) = unsafe { (*(*crate::sys::API).system).error } {
33 let f: unsafe extern "C" fn(*const core::ffi::c_char, ...) = f;
36 let p =
37 core::ptr::addr_of!(f) as *const _ as *const unsafe extern "C" fn(*const core::ffi::c_char, ...) -> !;
38 let f = unsafe { p.as_ref() }.unwrap();
39
40 if let Ok(s) = alloc::ffi::CString::new(text.as_ref()) {
41 unsafe { f(s.as_ptr() as _) }
42 } else {
43 unsafe { f(text.as_ref().as_ptr() as _) }
44 }
45 } else {
46 abort()
48 }
49}