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