#![deny(clippy::unwrap_used)]
#![deny(missing_docs)]
pub mod api;
#[forbid(unsafe_code)]
pub mod error;
#[forbid(unsafe_code)]
pub mod log;
#[forbid(unsafe_code)]
pub mod util;
use std::{any::Any, panic::PanicHookInfo};
pub use api::*;
pub use error::*;
pub use util::*;
pub use simics_macro::*;
#[cfg(feature = "global-allocator")]
#[global_allocator]
static GLOBAL: SimicsAlloc = SimicsAlloc;
pub fn panic_message(payload: &Box<dyn Any + Send>) -> &str {
imp::get_panic_message(payload.as_ref()).unwrap_or({
"Box<dyn Any>"
})
}
pub fn get_panic_message(payload: &Box<dyn Any + Send>) -> Option<&str> {
imp::get_panic_message(payload.as_ref())
}
pub fn panic_info_message<'pi>(panic_info: &'pi PanicHookInfo<'_>) -> &'pi str {
imp::get_panic_message(panic_info.payload()).unwrap_or({
"Box<dyn Any>"
})
}
pub fn get_panic_info_message<'pi>(panic_info: &'pi PanicHookInfo<'_>) -> Option<&'pi str> {
imp::get_panic_message(panic_info.payload())
}
mod imp {
use std::any::Any;
pub(super) fn get_panic_message(payload: &(dyn Any + Send)) -> Option<&str> {
match payload.downcast_ref::<&'static str>() {
Some(msg) => Some(*msg),
None => match payload.downcast_ref::<String>() {
Some(msg) => Some(msg.as_str()),
None => None,
},
}
}
}
pub fn panic_handler(info: &PanicHookInfo<'_>) -> ! {
let message = panic_info_message(info);
if let Some(location) = info.location() {
eprintln!("{message}: {location}");
} else {
eprintln!("{message}");
}
unsafe { crate::sys::SIM_quit(1) }
}