Skip to main content

luaur_vm/functions/
lua_b_pcally.rs

1//! Node: `cxx:Function:Luau.VM:VM/src/lbaselib.cpp:293:luaB_pcally`
2//! Source: `VM/src/lbaselib.cpp:293-312` (hand-ported)
3
4use crate::functions::lua_b_pcallrun::lua_b_pcallrun;
5use crate::functions::lua_d_pcall::luaD_pcall;
6use crate::functions::lua_gettop::lua_gettop;
7use crate::functions::lua_insert::lua_insert;
8use crate::functions::lua_l_checkany::lua_l_checkany;
9use crate::functions::lua_pushboolean::lua_pushboolean;
10use crate::functions::lua_rawcheckstack::lua_rawcheckstack;
11use crate::macros::c_call_yield::C_CALL_YIELD;
12use crate::macros::expandstacklimit::expandstacklimit;
13use crate::macros::isyielded::isyielded;
14use crate::macros::lua_callinfo_handle::LUA_CALLINFO_HANDLE;
15use crate::macros::savestack::savestack;
16use crate::type_aliases::lua_state::lua_State;
17use crate::type_aliases::stk_id::StkId;
18
19#[allow(non_snake_case)]
20pub unsafe fn lua_b_pcally(L: *mut lua_State) -> i32 {
21    lua_l_checkany(L, 1);
22
23    let func: StkId = (*L).base;
24    (*(*L).ci).flags |= LUA_CALLINFO_HANDLE as u32;
25
26    let status = luaD_pcall(
27        L,
28        Some(lua_b_pcallrun),
29        func as *mut core::ffi::c_void,
30        savestack!(L, func) as isize,
31        0,
32    );
33
34    expandstacklimit!(L, (*L).top);
35
36    if status == 0 && isyielded(L) {
37        return C_CALL_YIELD;
38    }
39
40    lua_rawcheckstack(L, 1);
41    lua_pushboolean(L, (status == 0) as i32);
42    lua_insert(L, 1);
43    lua_gettop(L)
44}