Skip to main content

luaur_bytecode/methods/
call_inliner_add_successor.rs

1use crate::enums::bc_block_edge_kind::BcBlockEdgeKind;
2use crate::records::bc_block::BcBlock;
3use crate::records::bc_block_edge::BcBlockEdge;
4use crate::records::bc_ref::BcRef;
5use crate::records::call_inliner::CallInliner;
6use luaur_common::macros::luau_assert::LUAU_ASSERT;
7
8impl<'a> CallInliner<'a> {
9    pub fn add_successor(
10        &mut self,
11        mut from: BcRef<'a, BcBlock>,
12        mut to: BcRef<'a, BcBlock>,
13        kind: BcBlockEdgeKind,
14    ) {
15        LUAU_ASSERT!(
16            kind != BcBlockEdgeKind::Fallthrough
17                || (!self.has_edge(
18                    &from.operator_deref().successors,
19                    BcBlockEdgeKind::Fallthrough
20                ) && !self.has_edge(
21                    &to.operator_deref().predecessors,
22                    BcBlockEdgeKind::Fallthrough
23                ))
24        );
25
26        let from_op = from.op;
27        let to_op = to.op;
28
29        from.operator_deref_mut().successors.push_back(BcBlockEdge {
30            kind,
31            target: to_op,
32        });
33
34        to.operator_deref_mut().predecessors.push_back(BcBlockEdge {
35            kind,
36            target: from_op,
37        });
38    }
39}