luaur_code_gen/functions/
call_prolog.rs1use 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}