Skip to main content

luaur_code_gen/methods/
ir_builder_handle_fastcall_fallback.rs

1use crate::enums::ir_cmd::IrCmd;
2use crate::records::ir_builder::IrBuilder;
3use crate::records::ir_op::IrOp;
4use crate::type_aliases::instruction_ir_builder::Instruction;
5
6use luaur_common::macros::luau_insn_c::LUAU_INSN_C;
7
8impl IrBuilder {
9    pub fn handle_fastcall_fallback(
10        &mut self,
11        fallback_or_undef: IrOp,
12        pc: *const Instruction,
13        i: i32,
14    ) {
15        let skip = unsafe { LUAU_INSN_C(*pc as u32) } as i32;
16
17        if fallback_or_undef.kind() != crate::enums::ir_op_kind::IrOpKind::Undef {
18            let next = self.block_at_inst((i + skip + 2) as u32);
19            self.inst_ir_cmd_ir_op(IrCmd::JUMP, next);
20            self.begin_block(fallback_or_undef);
21
22            self.active_fastcall_fallback = true;
23            self.fastcall_fallback_return = next;
24        } else {
25            self.cmd_skip_target = i + skip + 2;
26        }
27    }
28}