use std::collections::BTreeMap;
use crate::decompiler::cfg::BlockId;
use super::super::form::SsaStmt;
use super::super::variable::SsaVariable;
use super::state::{BlockExec, SlotState};
use super::SsaBuilder;
impl SsaBuilder<'_> {
pub(super) fn execute_block(
&self,
bid: BlockId,
entry: &[SsaVariable],
entry_slots: &SlotState,
versions: &mut BTreeMap<String, usize>,
) -> BlockExec {
let Some(block) = self.cfg.block(bid) else {
return BlockExec::default();
};
let mut stack: Vec<SsaVariable> = entry.to_vec();
let mut slots: SlotState = entry_slots.clone();
let mut stmts: Vec<SsaStmt> = Vec::new();
let mut uses: Vec<(SsaVariable, usize)> = Vec::new();
for idx in block.instruction_range.clone() {
let Some(instr) = self.instructions.get(idx) else {
continue;
};
self.apply_instruction(
instr, &mut stack, &mut slots, &mut stmts, &mut uses, versions,
);
}
BlockExec {
exit_stack: stack,
exit_slots: slots,
stmts,
uses,
}
}
}