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 PUSHNEWDEPOSIT_FUNC_INDEX: usize = 4;
pub const USETICKS_FUNC_INDEX: usize = 5;
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_useTicks" => FuncInstance::alloc_host(
Signature::new(&[ValueType::I32][..], None),
USETICKS_FUNC_INDEX,
),
"eth2_loadPreStateRoot" => FuncInstance::alloc_host(
Signature::new(&[ValueType::I32][..], None),
LOADPRESTATEROOT_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_savePostStateRoot" => FuncInstance::alloc_host(
Signature::new(&[ValueType::I32][..], None),
SAVEPOSTSTATEROOT_FUNC_INDEX,
),
"eth2_pushNewDeposit" => FuncInstance::alloc_host(
Signature::new(&[ValueType::I32][..], None),
PUSHNEWDEPOSIT_FUNC_INDEX,
),
_ => {
return Err(InterpreterError::Function(format!(
"host module doesn't export function with name {}",
field_name
)))
}
};
Ok(func_ref)
}
}