Skip to main content

luaur_bytecode/methods/
call_inliner_find_target_call_projections.rs

1use 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}