Skip to main content

luaur_code_gen/functions/
execute_setglobal.rs

1use luaur_vm::functions::lua_v_settable::lua_v_settable;
2use luaur_vm::macros::clvalue::clvalue;
3use luaur_vm::macros::sethvalue::sethvalue;
4use luaur_vm::macros::ttisstring::ttisstring;
5use luaur_vm::type_aliases::stk_id::StkId;
6use luaur_vm::type_aliases::t_value::TValue;
7
8use crate::macros::vm_kv::VM_KV;
9use crate::macros::vm_patch_c::VM_PATCH_C;
10use crate::macros::vm_protect::vm_protect;
11use crate::macros::vm_reg::VM_REG;
12use crate::type_aliases::instruction_ir_builder::Instruction;
13use crate::type_aliases::lua_state::lua_State;
14
15use luaur_common::macros::luau_assert::LUAU_ASSERT;
16use luaur_common::macros::luau_insn_a::LUAU_INSN_A;
17use luaur_common::macros::luau_insn_c::LUAU_INSN_C;
18
19pub unsafe fn execute_setglobal(
20    L: *mut lua_State,
21    pc: *const Instruction,
22    base: StkId,
23    k: *mut TValue,
24) -> *const Instruction {
25    let l_ptr = L as *mut luaur_vm::records::lua_state::lua_State;
26    let cl = clvalue!((*(*l_ptr).ci).func);
27
28    let mut pc_ptr = pc;
29    let insn = *pc_ptr;
30    pc_ptr = pc_ptr.add(1);
31
32    let ra = VM_REG!(LUAU_INSN_A(insn) as i32, l_ptr, base);
33    let aux = *pc_ptr;
34    pc_ptr = pc_ptr.add(1);
35
36    let kv = (k as *const TValue).add(aux as usize);
37    LUAU_ASSERT!(ttisstring!(kv));
38
39    let h = (*cl).env;
40    let slot = (LUAU_INSN_C(insn) as i32) & (*h).nodemask8 as i32;
41
42    let mut g = TValue::default();
43    sethvalue!(l_ptr, &mut g, h);
44    (*l_ptr).cachedslot = slot;
45
46    let mut current_base = base;
47    vm_protect!(l_ptr, pc_ptr, current_base, {
48        lua_v_settable(l_ptr, &g as *const TValue, kv as *mut TValue, ra);
49    });
50
51    VM_PATCH_C(pc_ptr.offset(-2), (*l_ptr).cachedslot);
52
53    pc_ptr
54}
55
56#[no_mangle]
57pub unsafe extern "C" fn executeSETGLOBAL(
58    L: *mut lua_State,
59    pc: *const Instruction,
60    base: StkId,
61    k: *mut TValue,
62) -> *const Instruction {
63    execute_setglobal(L, pc, base, k)
64}