ewasm 0.2.3

A modular WebAssembly runtime for Ethereum 2.0.
Documentation
use wasmi::{
    Error as InterpreterError, FuncInstance, FuncRef, ModuleImportResolver, Signature, ValueType,
};

pub const LOADPRESTATEROOT_FUNC_INDEX: usize = 0;
pub const BLOCKDATASIZE_FUNC_INDEX: usize = 1;
pub const BLOCKDATACOPY_FUNC_INDEX: usize = 2;
pub const SAVEPOSTSTATEROOT_FUNC_INDEX: usize = 3;
pub const BUFFERGET_FUNC_INDEX: usize = 4;
pub const BUFFERSET_FUNC_INDEX: usize = 5;
pub const BUFFERMERGE_FUNC_INDEX: usize = 6;
pub const BUFFERCLEAR_FUNC_INDEX: usize = 7;
pub const LOADMODULE_FUNC_INDEX: usize = 8;
pub const EXPOSE_FUNC_INDEX: usize = 9;
pub const ARGUMENT_FUNC_INDEX: usize = 10;
pub const RETURN_FUNC_INDEX: usize = 11;
pub const CALLMODULE_FUNC_INDEX: usize = 12;
pub const PRINT_FUNC_INDEX: usize = 99;

pub struct RuntimeModuleImportResolver;

impl<'a> ModuleImportResolver for RuntimeModuleImportResolver {
    fn resolve_func(
        &self,
        field_name: &str,
        _signature: &Signature,
    ) -> Result<FuncRef, InterpreterError> {
        let func_ref = match field_name {
            "eth2_loadPreStateRoot" => FuncInstance::alloc_host(
                Signature::new(&[ValueType::I32][..], None),
                LOADPRESTATEROOT_FUNC_INDEX,
            ),
            "eth2_savePostStateRoot" => FuncInstance::alloc_host(
                Signature::new(&[ValueType::I32][..], None),
                SAVEPOSTSTATEROOT_FUNC_INDEX,
            ),
            "eth2_blockDataSize" => FuncInstance::alloc_host(
                Signature::new(&[][..], Some(ValueType::I32)),
                BLOCKDATASIZE_FUNC_INDEX,
            ),
            "eth2_blockDataCopy" => FuncInstance::alloc_host(
                Signature::new(&[ValueType::I32, ValueType::I32, ValueType::I32][..], None),
                BLOCKDATACOPY_FUNC_INDEX,
            ),
            "eth2_bufferGet" => FuncInstance::alloc_host(
                Signature::new(
                    &[ValueType::I32, ValueType::I32, ValueType::I32][..],
                    Some(ValueType::I32),
                ),
                BUFFERGET_FUNC_INDEX,
            ),
            "eth2_bufferSet" => FuncInstance::alloc_host(
                Signature::new(&[ValueType::I32, ValueType::I32, ValueType::I32][..], None),
                BUFFERSET_FUNC_INDEX,
            ),
            "eth2_bufferMerge" => FuncInstance::alloc_host(
                Signature::new(&[ValueType::I32, ValueType::I32][..], None),
                BUFFERMERGE_FUNC_INDEX,
            ),
            "eth2_bufferClear" => FuncInstance::alloc_host(
                Signature::new(&[ValueType::I32][..], None),
                BUFFERCLEAR_FUNC_INDEX,
            ),
            "eth2_loadModule" => FuncInstance::alloc_host(
                Signature::new(&[ValueType::I32; 3][..], None),
                LOADMODULE_FUNC_INDEX,
            ),
            "eth2_callModule" => FuncInstance::alloc_host(
                Signature::new(&[ValueType::I32; 7][..], Some(ValueType::I32)),
                CALLMODULE_FUNC_INDEX,
            ),
            "eth2_expose" => FuncInstance::alloc_host(
                Signature::new(&[ValueType::I32, ValueType::I32][..], None),
                EXPOSE_FUNC_INDEX,
            ),
            "eth2_argument" => FuncInstance::alloc_host(
                Signature::new(&[ValueType::I32, ValueType::I32][..], Some(ValueType::I32)),
                ARGUMENT_FUNC_INDEX,
            ),
            "eth2_return" => FuncInstance::alloc_host(
                Signature::new(&[ValueType::I32, ValueType::I32][..], Some(ValueType::I32)),
                RETURN_FUNC_INDEX,
            ),
            "print" => FuncInstance::alloc_host(
                Signature::new(&[ValueType::I32; 2][..], None),
                PRINT_FUNC_INDEX,
            ),
            _ => {
                return Err(InterpreterError::Function(format!(
                    "host module doesn't export function with name {}",
                    field_name
                )))
            }
        };
        Ok(func_ref)
    }
}