luaur_vm/functions/
lua_d_rawrunprotected_ldo.rs1use crate::enums::lua_status::lua_Status;
7use crate::functions::lua_g_pusherror::lua_g_pusherror;
8use crate::records::lua_exception::lua_exception;
9use crate::type_aliases::lua_state::lua_State;
10use crate::type_aliases::pfunc::Pfunc;
11use luaur_common::macros::luau_assert::LUAU_ASSERT;
12
13#[allow(non_snake_case)]
14pub unsafe fn luaD_rawrunprotected(
15 L: *mut lua_State,
16 f: Pfunc,
17 ud: *mut core::ffi::c_void,
18) -> core::ffi::c_int {
19 let mut status: core::ffi::c_int = 0;
20
21 crate::functions::install_lua_exception_panic_hook::install_lua_exception_panic_hook();
24
25 let result = std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| {
26 if let Some(f) = f {
27 f(L, ud);
28 }
29 }));
30
31 if let Err(payload) = result {
32 if let Some(e) = payload.downcast_ref::<lua_exception>() {
33 LUAU_ASSERT!(e.getThread() == L as *const lua_State);
36 status = e.getStatus();
37 } else {
38 let msg: &str = if let Some(s) = payload.downcast_ref::<&str>() {
43 s
44 } else if let Some(s) = payload.downcast_ref::<alloc::string::String>() {
45 s.as_str()
46 } else {
47 "unknown error"
48 };
49 let cmsg = std::ffi::CString::new(msg)
50 .unwrap_or_else(|_| std::ffi::CString::new("invalid error message").unwrap());
51 lua_g_pusherror(L, cmsg.as_ptr());
54 status = lua_Status::LUA_ERRRUN as core::ffi::c_int;
55 }
56 }
57
58 status
59}
60
61#[allow(unused_imports)]
62pub use luaD_rawrunprotected as lua_d_rawrunprotected;