Trait wasmi::Externals
[−]
[src]
pub trait Externals { fn invoke_index(
&mut self,
index: usize,
args: RuntimeArgs
) -> Result<Option<RuntimeValue>, Error>; }
Trait that allows to implement host functions.
Examples
use wasmi::{ Externals, RuntimeValue, RuntimeArgs, Error, ModuleImportResolver, FuncRef, ValueType, Signature, FuncInstance }; struct HostExternals { counter: usize, } const ADD_FUNC_INDEX: usize = 0; impl Externals for HostExternals { fn invoke_index( &mut self, index: usize, args: RuntimeArgs, ) -> Result<Option<RuntimeValue>, Error> { match index { ADD_FUNC_INDEX => { let a: u32 = args.nth(0).unwrap(); let b: u32 = args.nth(1).unwrap(); let result = a + b; Ok(Some(RuntimeValue::I32(result as i32))) } _ => panic!("Unimplemented function at {}", index), } } } impl HostExternals { fn check_signature( &self, index: usize, signature: &Signature ) -> bool { let (params, ret_ty): (&[ValueType], Option<ValueType>) = match index { ADD_FUNC_INDEX => (&[ValueType::I32, ValueType::I32], Some(ValueType::I32)), _ => return false, }; signature.params() == params && signature.return_type() == ret_ty } } impl ModuleImportResolver for HostExternals { fn resolve_func( &self, field_name: &str, signature: &Signature ) -> Result<FuncRef, Error> { let index = match field_name { "add" => ADD_FUNC_INDEX, _ => { return Err(Error::Instantiation( format!("Export {} not found", field_name), )) } }; Ok(FuncInstance::alloc_host( Signature::new(&[ValueType::I32, ValueType::I32][..], Some(ValueType::I32)), ADD_FUNC_INDEX, )) } }
Required Methods
fn invoke_index(
&mut self,
index: usize,
args: RuntimeArgs
) -> Result<Option<RuntimeValue>, Error>
&mut self,
index: usize,
args: RuntimeArgs
) -> Result<Option<RuntimeValue>, Error>
Implementors
impl Externals for NopExternals