#[cfg(not(feature = "ethexe"))]
use gprimitives::ReservationId;
use gprimitives::{ActorId, CodeId, MessageId};
pub(crate) trait AsRawPtr: AsRef<[u8]> + AsMut<[u8]> {
fn as_ptr(&self) -> *const [u8; 32] {
self.as_ref().as_ptr() as *const _
}
fn as_mut_ptr(&mut self) -> *mut [u8; 32] {
self.as_mut().as_mut_ptr() as *mut _
}
}
impl AsRawPtr for ActorId {}
impl AsRawPtr for CodeId {}
impl AsRawPtr for MessageId {}
#[cfg(not(feature = "ethexe"))]
impl AsRawPtr for ReservationId {}
pub mod ext {
#[cfg(any(feature = "debug", debug_assertions))]
use {
crate::stack_buffer::{self, MAX_BUFFER_SIZE},
core::{
fmt::{self, Write as _},
mem::MaybeUninit,
},
};
#[cfg(any(feature = "debug", debug_assertions))]
pub fn debug(data: &str) {
unsafe { gsys::gr_debug(data.as_ptr(), data.len() as u32) }
}
#[cfg(any(feature = "debug", debug_assertions))]
pub fn stack_debug(args: fmt::Arguments<'_>) {
struct StackFmtWriter<'a> {
buf: &'a mut [MaybeUninit<u8>],
pos: usize,
}
impl fmt::Write for StackFmtWriter<'_> {
fn write_str(&mut self, s: &str) -> fmt::Result {
let upper_bound = (self.pos + s.len()).min(MAX_BUFFER_SIZE);
if let Some(buf) = self.buf.get_mut(self.pos..upper_bound) {
let buf = buf as *mut [MaybeUninit<u8>] as *mut [u8];
let s = &s.as_bytes()[..buf.len()];
unsafe {
(*buf).copy_from_slice(s);
}
self.pos += buf.len();
}
Ok(())
}
}
stack_buffer::with_byte_buffer(MAX_BUFFER_SIZE, |buf| {
let mut writer = StackFmtWriter { buf, pos: 0 };
writer.write_fmt(args).expect("fmt failed");
unsafe { gsys::gr_debug(writer.buf.as_ptr().cast(), writer.pos as u32) }
});
}
pub fn panic(data: &[u8]) -> ! {
unsafe { gsys::gr_panic(data.as_ptr(), data.len() as u32) }
}
pub fn panic_str(data: &str) -> ! {
panic(data.as_bytes())
}
pub fn oom_panic() -> ! {
unsafe { gsys::gr_oom_panic() }
}
}
#[cfg(any(feature = "debug", debug_assertions))]
#[macro_export]
macro_rules! debug {
($fmt:expr) => {
$crate::ext::stack_debug(format_args!($fmt))
};
($fmt:expr, $($args:tt)*) => {
$crate::ext::stack_debug(format_args!($fmt, $($args)*))
};
}
#[cfg(not(any(feature = "debug", debug_assertions)))]
#[allow(missing_docs)]
#[macro_export]
macro_rules! debug {
($fmt:expr) => {};
($fmt:expr, $($args:tt)*) => {};
}
#[macro_export]
macro_rules! static_mut {
($expr:expr) => {{
#[allow(clippy::deref_addrof)] let ret: &mut _ = (&mut *&raw mut $expr);
ret
}};
}
#[macro_export]
macro_rules! static_ref {
($expr:expr) => {{
#[allow(clippy::deref_addrof)] let ret: &_ = (&*&raw const $expr);
ret
}};
}