Skip to main content

luaur_vm/functions/
lua_d_callny.rs

1use crate::functions::lua_d_check_cstack::luaD_checkCstack;
2use crate::functions::performcall::performcall;
3use crate::macros::isyielded::isyielded;
4use crate::macros::lua_c_check_gc::luaC_checkGC;
5use crate::macros::lua_multret::LUA_MULTRET;
6use crate::macros::luai_maxccalls::LUAI_MAXCCALLS;
7use crate::macros::restorestack::restorestack;
8use crate::macros::savestack::savestack;
9use crate::type_aliases::lua_state::lua_State;
10use crate::type_aliases::stk_id::StkId;
11use luaur_common::macros::luau_assert::LUAU_ASSERT;
12
13#[no_mangle]
14pub unsafe fn lua_d_callny(L: *mut lua_State, func: StkId, nresults: core::ffi::c_int) {
15    let l_ref = &mut *L;
16
17    l_ref.nCcalls += 1;
18    if l_ref.nCcalls >= LUAI_MAXCCALLS as u16 {
19        luaD_checkCstack(L);
20    }
21
22    LUAU_ASSERT!(l_ref.nCcalls > l_ref.baseCcalls);
23
24    let funcoffset = savestack!(L, func);
25
26    performcall(L, func, nresults, false);
27
28    LUAU_ASSERT!(!isyielded(L));
29
30    if nresults != LUA_MULTRET {
31        (*L).top = restorestack!(L, funcoffset).add(nresults as usize);
32    }
33
34    (*L).nCcalls -= 1;
35    luaC_checkGC!(L);
36}