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