Skip to main content

luaur_bytecode/methods/
bytecode_graph_serializer_patch_jump.rs

1use crate::records::bc_block::BcBlock;
2use crate::records::bytecode_graph_serializer::BytecodeGraphSerializer;
3use crate::records::jump_info::JumpInfo;
4use luaur_common::functions::is_jump_d::isJumpD;
5use luaur_common::functions::is_skip_c::isSkipC;
6use luaur_common::macros::luau_assert::LUAU_ASSERT;
7
8impl<'a> BytecodeGraphSerializer<'a> {
9    pub fn patch_jump(&mut self, jump: &JumpInfo) {
10        let target = self.func.block_op(jump.targetBlock);
11        LUAU_ASSERT!(target.startpc != BcBlock::K_BLOCK_NO_START_PC);
12
13        if isJumpD(jump.op) {
14            let patched = self
15                .bcb
16                .patch_jump_d(jump.instructionPC as usize, target.startpc as usize);
17            LUAU_ASSERT!(patched);
18        } else if isSkipC(jump.op) {
19            let patched = self
20                .bcb
21                .patch_skip_c(jump.instructionPC as usize, target.startpc as usize);
22            LUAU_ASSERT!(patched);
23        }
24    }
25}