neo-decompiler 0.10.2

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 crate::instruction::Instruction;

use super::super::super::HighLevelEmitter;
use super::replace_dynamic_stack_survivors;

impl HighLevelEmitter {
    pub(in super::super::super) fn emit_reverse_fixed(
        &mut self,
        instruction: &Instruction,
        count: usize,
    ) {
        self.push_comment(instruction);
        if self.stack.len() < count {
            self.stack_underflow(instruction, count);
            return;
        }
        let start = self.stack.len() - count;
        self.stack[start..].reverse();
        self.statements
            .push(format!("// reverse top {count} stack values"));
    }

    pub(in super::super::super) fn emit_reverse_n(&mut self, instruction: &Instruction) {
        self.push_comment(instruction);
        let Some(count_name) = self.stack.pop() else {
            self.stack_underflow(instruction, 1);
            return;
        };

        let count_literal = self.take_usize_literal(&count_name);

        if let Some(count) = count_literal {
            if self.stack.len() >= count {
                let start = self.stack.len() - count;
                self.stack[start..].reverse();
                self.statements
                    .push(format!("// reverse top {count} stack values"));
                return;
            }
        }

        self.statements
            .push(format!("// reverse top {count_name} stack values"));
        replace_dynamic_stack_survivors(self, "reverse_n_top", &count_name);
    }
}