Skip to main content

luaur_code_gen/functions/
get_jump_target.rs

1use 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}