Skip to main content

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}