luaur_bytecode/methods/
call_inliner_find_target_call_projections.rs1use crate::records::bc_function::BcFunction;
2use crate::records::bc_op::BcOp;
3use crate::records::bc_phi::BcPhi;
4use crate::records::bc_proj::BcProj;
5use crate::records::call_inliner::CallInliner;
6
7impl<'a> CallInliner<'a> {
8 pub fn find_target_call_projections(&mut self) {
9 for i in 0..self.caller.projections.len() {
10 let proj = self.caller.projections[i as usize];
11 if proj.op == self.call.op() {
12 let proj_op =
13 BcOp::bc_op_bc_op_kind_u32(crate::enums::bc_op_kind::BcOpKind::Proj, i as u32);
14 if self.call_projections.contains(&proj_op) {
15 continue;
16 }
17 if (proj.index as usize) >= self.return_ops.len() {
18 self.return_ops.resize(proj.index as usize + 1, BcOp::new());
19 }
20 let phi_op = self.caller.add_phi();
21 let mut phi = self.caller.phi(phi_op);
22 phi.operator_deref_mut().ops.push_back(proj_op);
23 self.call_projections.insert(proj_op);
24 self.return_ops[proj.index as usize] = phi_op;
25 }
26 }
27 }
28}