132 lines
3.1 KiB
Rust
132 lines
3.1 KiB
Rust
macro_rules! bug_msg {
|
|
($arg:expr) => {
|
|
concat!(
|
|
"mlua internal error: ",
|
|
$arg,
|
|
" (this is a bug, please file an issue)"
|
|
)
|
|
};
|
|
}
|
|
|
|
macro_rules! cstr {
|
|
($s:expr) => {
|
|
concat!($s, "\0") as *const str as *const [::std::os::raw::c_char]
|
|
as *const ::std::os::raw::c_char
|
|
};
|
|
}
|
|
|
|
macro_rules! mlua_panic {
|
|
($msg:expr) => {
|
|
panic!(bug_msg!($msg))
|
|
};
|
|
|
|
($msg:expr,) => {
|
|
mlua_panic!($msg)
|
|
};
|
|
|
|
($msg:expr, $($arg:expr),+) => {
|
|
panic!(bug_msg!($msg), $($arg),+)
|
|
};
|
|
|
|
($msg:expr, $($arg:expr),+,) => {
|
|
mlua_panic!($msg, $($arg),+)
|
|
};
|
|
}
|
|
|
|
macro_rules! mlua_assert {
|
|
($cond:expr, $msg:expr) => {
|
|
assert!($cond, bug_msg!($msg));
|
|
};
|
|
|
|
($cond:expr, $msg:expr,) => {
|
|
mlua_assert!($cond, $msg);
|
|
};
|
|
|
|
($cond:expr, $msg:expr, $($arg:expr),+) => {
|
|
assert!($cond, bug_msg!($msg), $($arg),+);
|
|
};
|
|
|
|
($cond:expr, $msg:expr, $($arg:expr),+,) => {
|
|
mlua_assert!($cond, $msg, $($arg),+);
|
|
};
|
|
}
|
|
|
|
macro_rules! mlua_debug_assert {
|
|
($cond:expr, $msg:expr) => {
|
|
debug_assert!($cond, bug_msg!($msg));
|
|
};
|
|
|
|
($cond:expr, $msg:expr,) => {
|
|
mlua_debug_assert!($cond, $msg);
|
|
};
|
|
|
|
($cond:expr, $msg:expr, $($arg:expr),+) => {
|
|
debug_assert!($cond, bug_msg!($msg), $($arg),+);
|
|
};
|
|
|
|
($cond:expr, $msg:expr, $($arg:expr),+,) => {
|
|
mlua_debug_assert!($cond, $msg, $($arg),+);
|
|
};
|
|
}
|
|
|
|
#[cfg(debug_assertions)]
|
|
macro_rules! mlua_expect {
|
|
($res:expr, $msg:expr $(,)?) => {
|
|
$res.expect(bug_msg!($msg))
|
|
};
|
|
}
|
|
|
|
#[cfg(not(debug_assertions))]
|
|
macro_rules! mlua_expect {
|
|
($res:expr, $msg:expr $(,)?) => {{
|
|
let x;
|
|
#[allow(unused_unsafe)]
|
|
{
|
|
x = unsafe { $res.into_iter().next().unwrap_unchecked() };
|
|
}
|
|
x
|
|
}};
|
|
}
|
|
|
|
#[cfg(feature = "module")]
|
|
#[doc(hidden)]
|
|
#[macro_export]
|
|
macro_rules! require_module_feature {
|
|
() => {};
|
|
}
|
|
|
|
#[cfg(not(feature = "module"))]
|
|
#[doc(hidden)]
|
|
#[macro_export]
|
|
macro_rules! require_module_feature {
|
|
() => {
|
|
compile_error!("Feature `module` must be enabled in the `mlua` crate");
|
|
};
|
|
}
|
|
|
|
macro_rules! protect_lua {
|
|
(@debug_name) => {
|
|
concat!("protect_lua[", file!(), ":", stringify!(line!()), ":", stringify!(column!()), "]")
|
|
.as_ptr().cast()
|
|
};
|
|
|
|
($state:expr, $nargs:expr, $nresults:expr, $f:expr) => {
|
|
crate::util::protect_lua_closure($state, $nargs, $nresults, $f, $crate::macros::protect_lua!(@debug_name))
|
|
};
|
|
|
|
($state:expr, $nargs:expr, $nresults:expr, fn($state_inner:ident) $code:expr) => {{
|
|
unsafe extern "C" fn do_call($state_inner: *mut ffi::lua_State) -> ::std::os::raw::c_int {
|
|
$code;
|
|
let nresults = $nresults;
|
|
if nresults == ::ffi::LUA_MULTRET {
|
|
ffi::lua_gettop($state_inner)
|
|
} else {
|
|
nresults
|
|
}
|
|
}
|
|
|
|
crate::util::protect_lua_call($state, $nargs, do_call, $crate::macros::protect_lua!(@debug_name))
|
|
}};
|
|
}
|
|
pub(crate) use protect_lua;
|