Skip to main content

luaur_vm/functions/
lua_d_callint.rs

1use crate::functions::lua_d_check_cstack::luaD_checkCstack;
2use crate::functions::performcall::performcall;
3use crate::macros::clvalue::clvalue;
4use crate::macros::isyielded::isyielded;
5use crate::macros::lua_c_check_gc::luaC_checkGC;
6use crate::macros::lua_multret::LUA_MULTRET;
7use crate::macros::luai_maxccalls::LUAI_MAXCCALLS;
8use crate::macros::restoreci::restoreci;
9use crate::macros::restorestack::restorestack;
10use crate::macros::saveci::saveci;
11use crate::macros::savestack::savestack;
12use crate::type_aliases::lua_state::lua_State;
13use crate::type_aliases::stk_id::StkId;
14use core::ffi::c_int;
15
16#[allow(non_snake_case)]
17pub unsafe fn lua_d_callint(l: *mut lua_State, func: StkId, nresults: c_int, preparereentry: bool) {
18    (*l).nCcalls = (*l).nCcalls.wrapping_add(1);
19    if (*l).nCcalls as i32 >= LUAI_MAXCCALLS {
20        luaD_checkCstack(l);
21    }
22
23    let mut fromyieldableccall = false;
24
25    if (*l).ci != (*l).base_ci {
26        let ccl = clvalue!((*(*l).ci).func);
27        let cc = core::ptr::addr_of!((*ccl).inner.c).cast::<crate::records::closure::CClosure>();
28        if (*ccl).isC != 0 && (*cc).cont.is_some() {
29            fromyieldableccall = true;
30            (*l).baseCcalls = (*l).baseCcalls.wrapping_add(1);
31        }
32    }
33
34    let funcoffset = savestack!(l, func);
35    let cioffset = saveci!(l, (*l).ci);
36
37    performcall(l, func, nresults, preparereentry);
38
39    let yielded = isyielded(l);
40
41    if fromyieldableccall {
42        (*l).baseCcalls = (*l).baseCcalls.wrapping_sub(1);
43
44        if yielded {
45            let callerci = restoreci!(l, cioffset);
46            (*callerci).top = restorestack!(l, funcoffset).add(if nresults != LUA_MULTRET {
47                nresults as usize
48            } else {
49                0
50            });
51        }
52    }
53
54    if nresults != LUA_MULTRET && !yielded {
55        (*l).top = restorestack!(l, funcoffset).add(nresults as usize);
56    }
57
58    (*l).nCcalls = (*l).nCcalls.wrapping_sub(1);
59    luaC_checkGC!(l);
60}
61
62#[allow(unused_imports)]
63pub use lua_d_callint as luaD_callint;