ewasm 0.2.3

A modular WebAssembly runtime for Ethereum 2.0.
Documentation
pub mod child;
pub mod root;

use typed_builder::TypedBuilder;

use wasmi::{MemoryInstance, MemoryRef, RuntimeValue, Trap};

pub type ExtResult = Result<Option<RuntimeValue>, Trap>;

#[derive(Debug, Clone, TypedBuilder)]
struct StackFrame {
    memory: MemoryRef,

    argument_offset: u32,
    argument_length: u32,

    return_offset: u32,
    return_length: u32,
}

impl StackFrame {
    pub fn transfer_argument(
        &self,
        dest: &MemoryRef,
        dest_ptr: u32,
        dest_len: u32,
    ) -> Result<u32, wasmi::Error> {
        let len = std::cmp::min(dest_len, self.argument_length);

        MemoryInstance::transfer(
            &self.memory,
            self.argument_offset as usize,
            dest,
            dest_ptr as usize,
            len as usize,
        )
        .map(|_| self.argument_length)
    }

    pub fn transfer_return(
        &self,
        src: &MemoryRef,
        src_ptr: u32,
        src_len: u32,
    ) -> Result<u32, wasmi::Error> {
        let len = std::cmp::min(src_len, self.return_length);

        MemoryInstance::transfer(
            src,
            src_ptr as usize,
            &self.memory,
            self.return_offset as usize,
            len as usize,
        )
        .map(|_| self.return_length)
    }
}