#[doc = crate::_tags!(code platform)]
#[doc = crate::_doc_location!("code")]
#[macro_export]
#[cfg_attr(cargo_primary_package, doc(hidden))]
macro_rules! set_panic_handler {
(loop) => {
#[panic_handler]
fn panic(_info: &::core::panic::PanicInfo) -> ! {
::core::hint::spin_loop();
loop {}
}
};
(unreachable) => {
#[panic_handler]
#[allow(unreachable_code, reason = "alternative architectures")]
fn panic(_info: &::core::panic::PanicInfo) -> ! {
#[cfg(target_arch = "wasm32")]
::core::arch::wasm32::unreachable();
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
unsafe {
$crate::asm!("pause"); $crate::asm!("hlt", options(nomem, nostack)); $crate::asm!("ud2", options(nomem, nostack)); }
#[cfg(target_arch = "arm")]
unsafe {
$crate::asm!("wfi"); $crate::asm!("udf #0"); }
#[cfg(target_arch = "aarch64")]
unsafe {
$crate::asm!("wfe"); $crate::asm!("udf #0"); }
#[cfg(any(target_arch = "riscv32", target_arch = "riscv64"))]
unsafe {
$crate::asm!("wfi"); $crate::asm!("ebreak"); $crate::asm!("unimp"); }
::core::hint::spin_loop();
loop {} }
};
(web) => {
$crate::set_panic_handler!(web: 1024);
};
(web: $buffer_bytes:literal) => {
#[panic_handler]
fn panic(info: &::core::panic::PanicInfo) -> ! {
#[cfg(target_arch = "wasm32")]
{
let mut buf = [0u8; $buffer_bytes];
$crate::JsConsole::group("#[panic_handler]");
match $crate::format_buf![&mut buf, "{}", info.message()] {
Ok(msg_str) => $crate::JsConsole::debug(msg_str),
Err(truncated) => {
$crate::JsConsole::debug(truncated);
$crate::JsConsole::warn("Panic message was truncated!");
}
}
match info.location()
.map(|loc| $crate::format_buf![&mut buf, "At {}:{}:{}",
loc.file(), loc.line(), loc.column()])
.unwrap_or(Ok("<panic location unknown>".into()))
{
Ok(loc_str) => $crate::JsConsole::debug(loc_str),
Err(truncated) => {
$crate::JsConsole::debug(truncated);
$crate::JsConsole::warn("Panic location was truncated!");
}
}
$crate::JsConsole::group_end();
::core::arch::wasm32::unreachable();
}
#[cfg(not(target_arch = "wasm32"))]
{
::core::hint::spin_loop();
loop {}
}
}
};
(custom, $func:path) => {
#[panic_handler]
fn panic(info: &::core::panic::PanicInfo) -> ! {
$func(info)
}
};
}
#[doc(inline)]
pub use set_panic_handler;