Skip to main content

luaur_code_gen/functions/
translate_inst_capture.rs

1use crate::enums::ir_cmd::IrCmd;
2use crate::macros::codegen_assert::CODEGEN_ASSERT;
3use crate::records::ir_builder::IrBuilder;
4use crate::type_aliases::instruction_ir_translation::Instruction;
5use luaur_common::enums::luau_capture_type::LuauCaptureType;
6use luaur_common::macros::luau_insn_a::LUAU_INSN_A;
7use luaur_common::macros::luau_insn_b::LUAU_INSN_B;
8
9pub fn translate_inst_capture(build: &mut IrBuilder, pc: *const Instruction, _pcpos: i32) {
10    let type_ = LUAU_INSN_A(unsafe { *pc }) as u8;
11    let index = LUAU_INSN_B(unsafe { *pc }) as u8;
12
13    match type_ {
14        x if x == LuauCaptureType::LCT_VAL as u8 => {
15            let reg = build.vm_reg(index as u8);
16            let const_uint = build.const_uint(0);
17            build.inst_ir_cmd_ir_op_ir_op(IrCmd::CAPTURE, reg, const_uint);
18        }
19        x if x == LuauCaptureType::LCT_REF as u8 => {
20            let reg = build.vm_reg(index as u8);
21            let const_uint = build.const_uint(1);
22            build.inst_ir_cmd_ir_op_ir_op(IrCmd::CAPTURE, reg, const_uint);
23        }
24        x if x == LuauCaptureType::LCT_UPVAL as u8 => {
25            let upvalue = build.vm_upvalue(index as u8);
26            let const_uint = build.const_uint(0);
27            build.inst_ir_cmd_ir_op_ir_op(IrCmd::CAPTURE, upvalue, const_uint);
28        }
29        _ => {
30            CODEGEN_ASSERT!(false, "Unknown upvalue capture type");
31        }
32    }
33}