neo-decompiler 0.10.1

Neo N3 NEF decompiler: parse, disassemble, lift bytecode to high-level pseudocode and C# skeletons, with a CLI, JSON reports, and optional WebAssembly bindings.
Documentation
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<'_> {
    /// Symbolically execute one block straight-line from `entry`.
    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,
        }
    }
}