Skip to main content

luaur_code_gen/functions/
on_enter.rs

1use crate::functions::get_code_gen_context::get_code_gen_context;
2use crate::macros::codegen_assert::CODEGEN_ASSERT;
3use crate::records::native_context::NativeContext;
4
5pub fn on_enter(
6    l: *mut crate::type_aliases::lua_state::lua_State,
7    proto: *mut luaur_vm::records::proto::Proto,
8) -> i32 {
9    type GateFn = unsafe extern "C" fn(
10        *mut crate::type_aliases::lua_state::lua_State,
11        *mut luaur_vm::records::proto::Proto,
12        usize,
13        *mut NativeContext,
14    ) -> core::ffi::c_int;
15
16    unsafe {
17        let code_gen_context = get_code_gen_context(l);
18
19        CODEGEN_ASSERT!(!code_gen_context.is_null());
20        CODEGEN_ASSERT!(!(*proto).execdata.is_null());
21        CODEGEN_ASSERT!((*(*l).ci).savedpc >= (*proto).code);
22        CODEGEN_ASSERT!((*(*l).ci).savedpc < (*proto).code.add((*proto).sizecode as usize));
23
24        let pc_offset = (*(*l).ci).savedpc.offset_from((*proto).code) as usize;
25        let instruction_offsets = (*proto).execdata as *mut u32;
26        let target = (*proto).exectarget + *instruction_offsets.add(pc_offset) as usize;
27
28        let gate: GateFn = core::mem::transmute((*code_gen_context).context.gateEntry);
29        gate(l, proto, target, &mut (*code_gen_context).context)
30    }
31}
32
33#[export_name = "on_enter"]
34pub unsafe extern "C" fn on_enter_export(
35    l: *mut crate::type_aliases::lua_state::lua_State,
36    proto: *mut luaur_vm::records::proto::Proto,
37) -> core::ffi::c_int {
38    on_enter(l, proto)
39}