diff --git a/src/interpreter/env.rs b/src/interpreter/env.rs index 951b022..861b06e 100644 --- a/src/interpreter/env.rs +++ b/src/interpreter/env.rs @@ -78,12 +78,12 @@ pub type UserFunctionClosure = Box; /// User-defined function execution interface pub trait UserFunctionInterface { /// Handles the user function invocation - fn call(&mut self, context: CallerContext) -> Result, Error>; + fn call(&mut self, module: &ModuleInstance, context: CallerContext) -> Result, Error>; } -impl UserFunctionInterface for T where T: FnMut(CallerContext) -> Result, Error> { - fn call(&mut self, context: CallerContext) -> Result, Error> { - (&mut *self)(context) +impl UserFunctionInterface for T where T: FnMut(&ModuleInstance, CallerContext) -> Result, Error> { + fn call(&mut self, module: &ModuleInstance, context: CallerContext) -> Result, Error> { + (&mut *self)(module, context) } } @@ -187,7 +187,7 @@ impl ModuleInstanceInterface for EnvModuleInstance { // user-defined function let user_index = idx - (INDEX_FUNC_MAX+1); let func = self.user_functions.get(user_index as usize).ok_or(Error::Trap(format!("Trying to invoke user-defined function {}", user_index)))?; - func.borrow_mut().call(outer) + func.borrow_mut().call(&self.instance, outer) }, // idx @ _ if idx == INDEX_FUNC_MAX + 1 => outer.value_stack.pop().map(|_| None), // TODO: `gas(i32) -> None` function // idx @ _ if idx == INDEX_FUNC_MAX + 2 => Ok(Some(RuntimeValue::I32(0))), // TODO: `_storage_size() -> i32` function diff --git a/src/interpreter/tests/basics.rs b/src/interpreter/tests/basics.rs index 8fef569..f9d8e9a 100644 --- a/src/interpreter/tests/basics.rs +++ b/src/interpreter/tests/basics.rs @@ -122,7 +122,7 @@ fn global_get_set() { #[test] fn with_user_functions() { - use interpreter::{UserFunction, UserFunctions}; + use interpreter::{UserFunction, UserFunctions, ModuleInstance}; let module = module() .with_import(ImportEntry::new("env".into(), "custom_alloc".into(), External::Function(0))) @@ -144,7 +144,7 @@ fn with_user_functions() { UserFunction { params: vec![ValueType::I32], result: Some(ValueType::I32), - closure: Box::new(move |context: CallerContext| { + closure: Box::new(move |_module: &ModuleInstance, context: CallerContext| { let prev = top; top = top + context.value_stack.pop_as::()?; Ok(Some(prev.into())) @@ -158,7 +158,7 @@ fn with_user_functions() { UserFunction { params: vec![ValueType::I32], result: Some(ValueType::I32), - closure: Box::new(move |_: CallerContext| { + closure: Box::new(move |_module: &ModuleInstance, _context: CallerContext| { rolling = rolling + 1; Ok(Some(rolling.into())) }), @@ -180,14 +180,14 @@ fn with_user_functions() { #[test] fn with_user_functions_extended() { - use interpreter::{UserFunction, UserFunctions, UserFunctionInterface}; + use interpreter::{UserFunction, UserFunctions, UserFunctionInterface, ModuleInstance}; struct UserMAlloc { top: i32, } impl UserFunctionInterface for UserMAlloc { - fn call(&mut self, context: CallerContext) -> Result, Error> { + fn call(&mut self, _module: &ModuleInstance, context: CallerContext) -> Result, Error> { let prev = self.top; self.top += context.value_stack.pop_as::()?; Ok(Some(prev.into()))