Skip to main content

luaur_code_gen/functions/
call_prolog.rs

1use core::ffi::{c_int, c_void};
2
3use luaur_vm::functions::lua_v_tryfunc_tm::lua_v_tryfunc_tm;
4use luaur_vm::macros::clvalue::clvalue;
5use luaur_vm::macros::ttisfunction::ttisfunction;
6use luaur_vm::records::call_info::CallInfo;
7use luaur_vm::records::closure::Closure;
8use luaur_vm::type_aliases::lua_state::lua_State;
9use luaur_vm::type_aliases::stk_id::StkId;
10use luaur_vm::type_aliases::t_value::TValue;
11
12pub unsafe fn call_prolog(
13    L: *mut lua_State,
14    ra: *mut TValue,
15    mut argtop: StkId,
16    nresults: c_int,
17) -> *mut Closure {
18    if !ttisfunction!(ra as *const TValue) {
19        lua_v_tryfunc_tm(L, ra);
20        argtop = argtop.add(1);
21    }
22
23    let ccl = clvalue!(ra as *const TValue);
24
25    let ci = incr_ci_local(L);
26    (*ci).func = ra;
27    (*ci).base = ra.add(1);
28    (*ci).top = argtop.add((*ccl).stacksize as usize);
29    (*ci).savedpc = core::ptr::null();
30    (*ci).flags = 0;
31    (*ci).nresults = nresults;
32
33    if luaur_common::FFlag::LuauClosureUsageCounter.get() {
34        (*ccl).usage += 1;
35    }
36
37    (*L).base = (*ci).base;
38    (*L).top = argtop;
39
40    luaur_vm::macros::lua_d_checkstackfornewci::luaD_checkstackfornewci(
41        L,
42        (*ccl).stacksize as c_int,
43    );
44
45    ccl
46}
47
48unsafe fn incr_ci_local(L: *mut lua_State) -> *mut CallInfo {
49    if (*L).ci == (*L).end_ci {
50        luaur_vm::functions::lua_d_grow_ci::luaD_growCI(L);
51    } else {
52        (*L).ci = (*L).ci.add(1);
53    }
54
55    (*L).ci
56}
57
58#[no_mangle]
59pub unsafe extern "C" fn callProlog(
60    L: *mut lua_State,
61    ra: *mut TValue,
62    argtop: StkId,
63    nresults: c_int,
64) -> *mut c_void {
65    call_prolog(L, ra, argtop, nresults).cast()
66}