Skip to main content

luaur_code_gen/functions/
disable_native_execution_for_function.rs

1use crate::functions::on_destroy_function::on_destroy_function;
2use crate::type_aliases::lua_state::lua_State;
3
4use luaur_vm::macros::clvalue::clvalue;
5use luaur_vm::macros::ttisfunction::ttisfunction;
6use luaur_vm::type_aliases::t_value::TValue;
7
8#[allow(non_snake_case)]
9pub fn disable_native_execution_for_function(L: *mut lua_State, level: i32) {
10    unsafe {
11        if L.is_null() {
12            return;
13        }
14
15        // CODEGEN_ASSERT(unsigned(level) < unsigned(L->ci - L->base_ci));
16        let ci = (*L).ci;
17        let base_ci = (*L).base_ci;
18
19        let diff = ci.offset_from(base_ci);
20        if !(level as u32) < diff as u32 {
21            // CODEGEN_ASSERT should abort via handler; keep behavior conservative if it doesn't.
22            return;
23        }
24
25        // const CallInfo* ci = L->ci - level;
26        let ci_ptr = ci.offset(-(level as isize));
27
28        // const TValue* o = ci->func;
29        let o = (*ci_ptr).func as *const TValue;
30
31        // CODEGEN_ASSERT(ttisfunction(o));
32        if !ttisfunction!(o) {
33            return;
34        }
35
36        // Proto* proto = clvalue(o)->l.p;
37        let cl = clvalue!(o);
38        let proto = (*(*cl).inner.l).p;
39
40        if proto.is_null() {
41            return;
42        }
43
44        // CODEGEN_ASSERT(proto->codeentry != proto->code);
45        if (*proto).codeentry == (*proto).code {
46            return;
47        }
48
49        on_destroy_function(L, proto);
50    }
51}