luaur_code_gen/methods/
ir_builder_handle_fastcall_fallback.rs1use 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}