use wasmi::{ Error as InterpreterError, Externals, FuncInstance, FuncRef, HostError, ImportsBuilder, ModuleImportResolver, ModuleInstance, ModuleRef, RuntimeArgs, RuntimeValue, Signature, Trap, ValueType, }; use crate::{print, println}; pub fn run() { use alloc::vec::Vec; let bytes = include_bytes!("../../data/h.wasm"); let b: Vec = bytes.iter().cloned().collect(); println!("loaded wasm into a Vec"); let module = wasmi::Module::from_buffer(&b).unwrap(); let mut imports = ImportsBuilder::new(); imports.push_resolver("h", &H); let instance = ModuleInstance::new(&module, &imports) .expect("failed to load wasm module") .assert_no_start(); println!("invoking export"); let _ = instance.invoke_export("h", &[], &mut H); } struct H; const H_FUNC: usize = 0; impl Externals for H { fn invoke_index( &mut self, index: usize, args: RuntimeArgs, ) -> Result, Trap> { use core::char::from_u32; match index { H_FUNC => { let ch_t: i32 = args.nth(0); let ch = from_u32(ch_t as u32); print!("{}", ch.unwrap()); Ok(None) } _ => panic!("unknown function called"), } } } impl ModuleImportResolver for H { fn resolve_func( &self, field_name: &str, _signature: &Signature, ) -> Result { let func_ref = match field_name { "h" => FuncInstance::alloc_host( Signature::new(&[ValueType::I32][..], None), H_FUNC, ), _ => panic!("unknwon function asked for"), }; Ok(func_ref) } }