Skip to main content

luaur_bytecode/methods/
bytecode_graph_serializer_reschedule.rs

1use crate::enums::bc_block_flag::BcBlockFlag;
2use crate::enums::bc_op_kind::BcOpKind;
3use crate::records::bc_block::BcBlock;
4use crate::records::bc_op::BcOp;
5use crate::records::bytecode_graph_serializer::BytecodeGraphSerializer;
6use luaur_common::LUAU_ASSERT;
7
8impl<'a> BytecodeGraphSerializer<'a> {
9    pub fn reschedule(&mut self) -> Vec<BcOp> {
10        let mut sorted_blocks: Vec<BcOp> = Vec::new();
11        sorted_blocks.reserve(self.func.blocks.len());
12        for i in 0..self.func.blocks.len() {
13            if (self.func.blocks[i as usize].flags & BcBlockFlag::Dead as u8) == 0 {
14                sorted_blocks.push(BcOp::bc_op_bc_op_kind_u32(BcOpKind::Block, i as u32));
15            }
16        }
17
18        sorted_blocks.sort_by(|op_a, op_b| {
19            let a_block = self.func.block_op(*op_a);
20            let a_sortkey = a_block.sortkey;
21            let a_chainkey = a_block.chainkey;
22            drop(a_block);
23
24            let b_block = self.func.block_op(*op_b);
25            let b_sortkey = b_block.sortkey;
26            let b_chainkey = b_block.chainkey;
27            drop(b_block);
28
29            if a_sortkey == b_sortkey {
30                a_chainkey.cmp(&b_chainkey)
31            } else {
32                a_sortkey.cmp(&b_sortkey)
33            }
34        });
35
36        LUAU_ASSERT!(sorted_blocks.last() == Some(&self.func.exit_block));
37        sorted_blocks.pop();
38
39        sorted_blocks
40    }
41}