luaur_analysis/methods/cfg_builder_fill_join_operands.rs
1//! Source: `Analysis/src/ControlFlowGraph.cpp:488-497` (hand-ported)
2//! C++ `void CFGBuilder::fillJoinOperands(Block* block, Join* j)`.
3use crate::records::block::Block;
4use crate::records::cfg_builder::CfgBuilder;
5use crate::records::join::Join;
6use crate::type_aliases::block_id::BlockId;
7
8impl CfgBuilder {
9 pub fn fill_join_operands(&mut self, block: *mut Block, j: *mut Join) {
10 unsafe {
11 // C++:
12 // for (BlockId pred : block->getPredecessors()) {
13 // auto def = readVariable(pred, j->definition->sym);
14 // j->operands.emplace_back(def);
15 // }
16 // trimTrivialJoin(j);
17 // Snapshot predecessors: readVariable recurses and may mutate `block`.
18 let preds: alloc::vec::Vec<BlockId> = (*block).get_predecessors().clone();
19 let sym = (*(*j).definition).sym.clone();
20 for pred in preds {
21 let def = self.read_variable(pred, sym.clone());
22 (*j).operands.push(def);
23 }
24 self.trim_trivial_join(j);
25 }
26 }
27}