Skip to main content

luaur_code_gen/functions/
execute_getvarargs_mult_ret.rs

1use core::ffi::c_int;
2
3use crate::macros::vm_protect::vm_protect;
4use crate::macros::vm_reg::VM_REG;
5use crate::type_aliases::instruction_ir_builder::Instruction;
6use crate::type_aliases::lua_state::lua_State;
7use luaur_vm::functions::lua_d_growstack::lua_d_growstack;
8use luaur_vm::macros::clvalue::clvalue;
9use luaur_vm::macros::setobj_2_s::setobj2s;
10use luaur_vm::macros::stacklimitreached::stacklimitreached;
11use luaur_vm::type_aliases::stk_id::StkId;
12use luaur_vm::type_aliases::t_value::TValue;
13
14pub unsafe fn execute_getvarargs_mult_ret(
15    L: *mut lua_State,
16    pc: *const Instruction,
17    base: StkId,
18    rai: c_int,
19) {
20    let l_ptr = L as *mut luaur_vm::records::lua_state::lua_State;
21    let cl = clvalue!((*(*l_ptr).ci).func);
22    let p = {
23        let l = &(*cl).inner.l;
24        l.p
25    };
26    let n = base.offset_from((*(*l_ptr).ci).func) as c_int - (*p).numparams as c_int - 1;
27
28    let mut current_base = base;
29    vm_protect!(l_ptr, pc, current_base, {
30        if stacklimitreached(l_ptr, n) {
31            lua_d_growstack(l_ptr, n);
32        }
33    });
34
35    let ra = VM_REG!(rai, l_ptr, current_base) as *mut TValue;
36    for j in 0..n {
37        setobj2s!(
38            l_ptr,
39            ra.add(j as usize),
40            current_base.sub(n as usize).add(j as usize) as *const TValue
41        );
42    }
43
44    (*l_ptr).top = ra.add(n as usize);
45}
46
47#[no_mangle]
48pub unsafe extern "C" fn executeGETVARARGSMultRet(
49    L: *mut lua_State,
50    pc: *const Instruction,
51    base: StkId,
52    rai: c_int,
53) {
54    execute_getvarargs_mult_ret(L, pc, base, rai);
55}