pub mod externals {
pub const CALL: usize = 1;
pub const ARGUMENT: usize = 2;
pub const RETURN: usize = 3;
pub const PRINT: usize = 99;
}
use wasmi::{
Error as InterpreterError, FuncInstance, FuncRef, ModuleImportResolver, Signature, ValueType,
};
pub struct ChildModuleImportResolver;
impl<'a> ModuleImportResolver for ChildModuleImportResolver {
fn resolve_func(
&self,
field_name: &str,
_signature: &Signature,
) -> Result<FuncRef, InterpreterError> {
let func_ref = match field_name {
"eth2_return" => FuncInstance::alloc_host(
Signature::new(&[ValueType::I32; 2][..], Some(ValueType::I32)),
externals::RETURN,
),
"eth2_argument" => FuncInstance::alloc_host(
Signature::new(&[ValueType::I32; 2][..], Some(ValueType::I32)),
externals::ARGUMENT,
),
"eth2_call" => FuncInstance::alloc_host(
Signature::new(&[ValueType::I32; 6][..], Some(ValueType::I32)),
externals::CALL,
),
"print" => FuncInstance::alloc_host(
Signature::new(&[ValueType::I32; 2][..], None),
externals::PRINT,
),
_ => {
return Err(InterpreterError::Function(format!(
"host module doesn't export function with name {}",
field_name
)))
}
};
Ok(func_ref)
}
}