luaur_code_gen/functions/
get_jump_target.rs1use crate::functions::is_fast_call::is_fast_call;
2use crate::functions::is_jump_d::is_jump_d;
3use crate::functions::is_skip_c::is_skip_c;
4use luaur_common::enums::luau_opcode::LuauOpcode;
5use luaur_common::macros::luau_insn_c::LUAU_INSN_C;
6use luaur_common::macros::luau_insn_d::LUAU_INSN_D;
7use luaur_common::macros::luau_insn_e::LUAU_INSN_E;
8use luaur_common::macros::luau_insn_op::LUAU_INSN_OP;
9
10pub fn get_jump_target(insn: u32, pc: u32) -> i32 {
11 let op_val = LUAU_INSN_OP(insn) as u8;
12 let op: LuauOpcode = unsafe { core::mem::transmute(op_val) };
13
14 if is_jump_d(op) {
15 (pc as i32) + LUAU_INSN_D(insn) + 1
16 } else if is_fast_call(op) {
17 (pc as i32) + (LUAU_INSN_C(insn) as i32) + 2
18 } else if is_skip_c(op) && LUAU_INSN_C(insn) != 0 {
19 (pc as i32) + (LUAU_INSN_C(insn) as i32) + 1
20 } else if op == LuauOpcode::LOP_JUMPX {
21 (pc as i32) + LUAU_INSN_E(insn) + 1
22 } else {
23 -1
24 }
25}