luaur-bytecode 0.1.1

Luau bytecode format and builder (Rust).
Documentation
use crate::enums::bc_block_flag::BcBlockFlag;
use crate::enums::bc_op_kind::BcOpKind;
use crate::records::bc_block::BcBlock;
use crate::records::bc_op::BcOp;
use crate::records::bytecode_graph_serializer::BytecodeGraphSerializer;
use luaur_common::LUAU_ASSERT;

impl<'a> BytecodeGraphSerializer<'a> {
    pub fn reschedule(&mut self) -> Vec<BcOp> {
        let mut sorted_blocks: Vec<BcOp> = Vec::new();
        sorted_blocks.reserve(self.func.blocks.len());
        for i in 0..self.func.blocks.len() {
            if (self.func.blocks[i as usize].flags & BcBlockFlag::Dead as u8) == 0 {
                sorted_blocks.push(BcOp::bc_op_bc_op_kind_u32(BcOpKind::Block, i as u32));
            }
        }

        sorted_blocks.sort_by(|op_a, op_b| {
            let a_block = self.func.block_op(*op_a);
            let a_sortkey = a_block.sortkey;
            let a_chainkey = a_block.chainkey;
            drop(a_block);

            let b_block = self.func.block_op(*op_b);
            let b_sortkey = b_block.sortkey;
            let b_chainkey = b_block.chainkey;
            drop(b_block);

            if a_sortkey == b_sortkey {
                a_chainkey.cmp(&b_chainkey)
            } else {
                a_sortkey.cmp(&b_sortkey)
            }
        });

        LUAU_ASSERT!(sorted_blocks.last() == Some(&self.func.exit_block));
        sorted_blocks.pop();

        sorted_blocks
    }
}