rwasm 0.4.3

ZK-friendly WebAssembly runtime optimized for blockchain and zero-knowledge applications
Documentation
use crate::{CompiledFunc, LocalDepth, NumLocals, RwasmExecutor, UntypedValue};

impl<'a, T> RwasmExecutor<'a, T> {
    #[inline(always)]
    pub(crate) fn visit_local_get(&mut self, local_depth: LocalDepth) {
        let value = self.sp.nth_back(local_depth as usize);
        self.sp.push(value);
        self.ip.add(1);
    }

    #[inline(always)]
    pub(crate) fn visit_local_set(&mut self, local_depth: LocalDepth) {
        let new_value = self.sp.pop();
        self.sp.set_nth_back(local_depth as usize, new_value);
        self.ip.add(1);
    }

    #[inline(always)]
    pub(crate) fn visit_local_tee(&mut self, local_depth: LocalDepth) {
        let new_value = self.sp.last();
        self.sp.set_nth_back(local_depth as usize, new_value);
        self.ip.add(1);
    }

    #[inline(always)]
    pub(crate) fn visit_drop(&mut self) {
        self.sp.drop();
        self.ip.add(1);
    }

    #[inline(always)]
    pub(crate) fn visit_select(&mut self) {
        self.sp.eval_top3(|e1, e2, e3| {
            let condition = <bool as From<UntypedValue>>::from(e3);
            if condition {
                e1
            } else {
                e2
            }
        });
        self.ip.add(1);
    }

    #[inline(always)]
    pub(crate) fn visit_ref_func(&mut self, compiled_func: CompiledFunc) {
        self.sp.push_as(compiled_func);
        self.ip.add(1);
    }

    #[inline(always)]
    pub(crate) fn visit_i32_const(&mut self, untyped_value: UntypedValue) {
        self.sp.push(untyped_value);
        self.ip.add(1);
    }

    #[inline(always)]
    pub(crate) fn visit_bulk_const(&mut self, imm: NumLocals) {
        // TODO(dmitry123): We can optimize it, but need to support bulk stack reset
        for _ in 0..imm {
            self.sp.push_i32(0);
        }
        self.ip.add(1);
    }

    #[inline(always)]
    pub(crate) fn visit_bulk_drop(&mut self, imm: NumLocals) {
        self.sp.drop_n(imm as usize);
        self.ip.add(1);
    }
}