luaur_bytecode/methods/
call_inliner_add_successor.rs1use 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}