#[doc(hidden)]
pub const __DEFAULT_HEAP_SIZE: usize = 32 * 1024;
#[macro_export]
macro_rules! cell_prelude {
() => {
const __WASM_SDK_HEAP_SIZE: usize = match option_env!("WASM_SDK_HEAP_SIZE") {
Some(s) => $crate::__parse_usize(s),
None => $crate::__DEFAULT_HEAP_SIZE,
};
$crate::define_alloc_heap!(__WASM_SDK_HEAP_SIZE);
$crate::define_panic_handlers!();
};
}
#[doc(hidden)]
pub const fn __parse_usize(s: &str) -> usize {
let bytes = s.as_bytes();
let mut i = 0;
let mut acc: usize = 0;
while i < bytes.len() {
let b = bytes[i];
if b == b'_' {
i += 1;
continue;
}
assert!(
b >= b'0' && b <= b'9',
"WASM_SDK_HEAP_SIZE must be a decimal integer"
);
acc = acc * 10 + (b - b'0') as usize;
i += 1;
}
acc
}
#[macro_export]
macro_rules! define_panic_handlers {
() => {
const _: () = {
use core::fmt::Write;
static BUF: $crate::__reexports::spin::Mutex<[u8; 192]> =
$crate::__reexports::spin::Mutex::new([0; 192]);
const BUSY_MSG: &str = "panic (buffer busy)";
#[panic_handler]
fn panic(info: &core::panic::PanicInfo<'_>) -> ! {
if let Some(mut guard) = BUF.try_lock() {
let ptr = guard.as_mut_ptr();
let cap = guard.len();
let mut w = $crate::RawBuf::new(ptr, cap);
let _ = w.write_str("wasm panic - ");
let _ = w.write_fmt(core::format_args!("{}", info.message()));
let _ = $crate::log_buffer(&w, $crate::LogLevel::Error);
if let Some(location) = info.location() {
let mut w = $crate::RawBuf::new(ptr, cap);
let _ = w.write_str(" ↪ ");
let _ = w.write_fmt(core::format_args!("{location}"));
let _ = $crate::log_buffer(&w, $crate::LogLevel::Error);
}
} else {
let _ = $crate::log(BUSY_MSG, $crate::LogLevel::Error);
}
core::arch::wasm32::unreachable()
}
};
};
}
#[cfg(all(feature = "alloc", target_arch = "wasm32"))]
const _: () = {
use core::fmt::Write;
static OOM_BUF: crate::__reexports::spin::Mutex<[u8; 192]> =
crate::__reexports::spin::Mutex::new([0; 192]);
#[alloc_error_handler]
fn oom(layout: core::alloc::Layout) -> ! {
if let Some(mut g) = OOM_BUF.try_lock() {
let ptr = g.as_mut_ptr();
let cap = g.len();
let mut w = crate::RawBuf::new(ptr, cap);
let _ = w.write_fmt(core::format_args!(
"wasm oom - size={} align={}; Double check your heap size.",
layout.size(),
layout.align()
));
let _ = crate::log_buffer(&w, crate::LogLevel::Error);
} else {
let _ = crate::log("wasm oom (buffer busy)", crate::LogLevel::Error);
}
core::arch::wasm32::unreachable();
}
};