diff --git a/CHANGELOG.md b/CHANGELOG.md index ca9290f5d5b..64b844d6be9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,7 @@ ### Changed +- [#1772](https://github.com/wasmerio/wasmer/pull/1772) Remove lifetime parameter from `NativeFunc`. - [#1762](https://github.com/wasmerio/wasmer/pull/1762) Allow the `=` sign in a WASI environment variable value. ### Fixed diff --git a/lib/api/src/externals/function.rs b/lib/api/src/externals/function.rs index 4cdf6b9121e..76ec08295ac 100644 --- a/lib/api/src/externals/function.rs +++ b/lib/api/src/externals/function.rs @@ -528,7 +528,7 @@ impl Function { /// // This results in an error: `RuntimeError` /// let sum_native = sum.native::<(i32, i32), i64>().unwrap(); /// ``` - pub fn native<'a, Args, Rets>(&self) -> Result, RuntimeError> + pub fn native(&self) -> Result, RuntimeError> where Args: WasmTypeList, Rets: WasmTypeList, diff --git a/lib/api/src/native.rs b/lib/api/src/native.rs index 733bfd67e9c..0e080d064e6 100644 --- a/lib/api/src/native.rs +++ b/lib/api/src/native.rs @@ -22,19 +22,19 @@ use wasmer_vm::{ /// A WebAssembly function that can be called natively /// (using the Native ABI). -pub struct NativeFunc<'a, Args = (), Rets = ()> { +pub struct NativeFunc { definition: FunctionDefinition, store: Store, address: *const VMFunctionBody, vmctx: *mut VMContext, arg_kind: VMFunctionKind, // exported: ExportFunction, - _phantom: PhantomData<(&'a (), Args, Rets)>, + _phantom: PhantomData<(Args, Rets)>, } -unsafe impl<'a, Args, Rets> Send for NativeFunc<'a, Args, Rets> {} +unsafe impl Send for NativeFunc {} -impl<'a, Args, Rets> NativeFunc<'a, Args, Rets> +impl NativeFunc where Args: WasmTypeList, Rets: WasmTypeList, @@ -57,12 +57,12 @@ where } } -impl<'a, Args, Rets> From<&NativeFunc<'a, Args, Rets>> for ExportFunction +impl From<&NativeFunc> for ExportFunction where Args: WasmTypeList, Rets: WasmTypeList, { - fn from(other: &NativeFunc<'a, Args, Rets>) -> Self { + fn from(other: &NativeFunc) -> Self { let signature = FunctionType::new(Args::wasm_types(), Rets::wasm_types()); Self { address: other.address, @@ -74,12 +74,12 @@ where } } -impl<'a, Args, Rets> From> for Function +impl From> for Function where Args: WasmTypeList, Rets: WasmTypeList, { - fn from(other: NativeFunc<'a, Args, Rets>) -> Self { + fn from(other: NativeFunc) -> Self { let signature = FunctionType::new(Args::wasm_types(), Rets::wasm_types()); Self { store: other.store, @@ -98,7 +98,7 @@ where macro_rules! impl_native_traits { ( $( $x:ident ),* ) => { #[allow(unused_parens, non_snake_case)] - impl<'a $( , $x )*, Rets> NativeFunc<'a, ( $( $x ),* ), Rets> + impl<$( $x , )* Rets> NativeFunc<( $( $x ),* ), Rets> where $( $x: FromToNativeWasmType, )* Rets: WasmTypeList, diff --git a/lib/api/tests/externals.rs b/lib/api/tests/externals.rs index 25fbdd4adea..29f1ce5e208 100644 --- a/lib/api/tests/externals.rs +++ b/lib/api/tests/externals.rs @@ -350,3 +350,29 @@ fn native_function_works() -> Result<()> { Ok(()) } + +#[test] +fn function_outlives_instance() -> Result<()> { + let store = Store::default(); + let wat = r#"(module + (type $sum_t (func (param i32 i32) (result i32))) + (func $sum_f (type $sum_t) (param $x i32) (param $y i32) (result i32) + local.get $x + local.get $y + i32.add) + (export "sum" (func $sum_f))) +"#; + + let f = { + let module = Module::new(&store, wat)?; + let instance = Instance::new(&module, &imports! {})?; + let f: NativeFunc<(i32, i32), i32> = instance.exports.get_native_function("sum")?; + + assert_eq!(f.call(4, 5)?, 9); + f + }; + + assert_eq!(f.call(4, 5)?, 9); + + Ok(()) +} diff --git a/lib/emscripten/src/lib.rs b/lib/emscripten/src/lib.rs index def9825b66e..4f33c657262 100644 --- a/lib/emscripten/src/lib.rs +++ b/lib/emscripten/src/lib.rs @@ -122,81 +122,78 @@ const STATIC_BASE: u32 = GLOBAL_BASE; pub struct EmscriptenData<'a> { pub globals: &'a EmscriptenGlobalsData, - pub malloc: Option>, - pub free: Option>, - pub memalign: Option>, - pub memset: Option>, - pub stack_alloc: Option>, + pub malloc: Option>, + pub free: Option>, + pub memalign: Option>, + pub memset: Option>, + pub stack_alloc: Option>, pub jumps: Vec>, pub opened_dirs: HashMap>, - pub dyn_call_i: Option>, - pub dyn_call_ii: Option>, - pub dyn_call_iii: Option>, - pub dyn_call_iiii: Option>, - pub dyn_call_iifi: Option>, - pub dyn_call_v: Option>, - pub dyn_call_vi: Option>, - pub dyn_call_vii: Option>, - pub dyn_call_viii: Option>, - pub dyn_call_viiii: Option>, + pub dyn_call_i: Option>, + pub dyn_call_ii: Option>, + pub dyn_call_iii: Option>, + pub dyn_call_iiii: Option>, + pub dyn_call_iifi: Option>, + pub dyn_call_v: Option>, + pub dyn_call_vi: Option>, + pub dyn_call_vii: Option>, + pub dyn_call_viii: Option>, + pub dyn_call_viiii: Option>, // round 2 - pub dyn_call_dii: Option>, - pub dyn_call_diiii: Option>, - pub dyn_call_iiiii: Option>, - pub dyn_call_iiiiii: Option>, - pub dyn_call_iiiiiii: Option>, - pub dyn_call_iiiiiiii: Option>, - pub dyn_call_iiiiiiiii: - Option>, + pub dyn_call_dii: Option>, + pub dyn_call_diiii: Option>, + pub dyn_call_iiiii: Option>, + pub dyn_call_iiiiii: Option>, + pub dyn_call_iiiiiii: Option>, + pub dyn_call_iiiiiiii: Option>, + pub dyn_call_iiiiiiiii: Option>, pub dyn_call_iiiiiiiiii: - Option>, + Option>, pub dyn_call_iiiiiiiiiii: - Option>, - pub dyn_call_vd: Option>, - pub dyn_call_viiiii: Option>, - pub dyn_call_viiiiii: Option>, - pub dyn_call_viiiiiii: Option>, - pub dyn_call_viiiiiiii: Option>, - pub dyn_call_viiiiiiiii: - Option>, + Option>, + pub dyn_call_vd: Option>, + pub dyn_call_viiiii: Option>, + pub dyn_call_viiiiii: Option>, + pub dyn_call_viiiiiii: Option>, + pub dyn_call_viiiiiiii: Option>, + pub dyn_call_viiiiiiiii: Option>, pub dyn_call_viiiiiiiiii: - Option>, - pub dyn_call_iij: Option>, - pub dyn_call_iji: Option>, - pub dyn_call_iiji: Option>, - pub dyn_call_iiijj: Option>, - pub dyn_call_j: Option>, - pub dyn_call_ji: Option>, - pub dyn_call_jii: Option>, - pub dyn_call_jij: Option>, - pub dyn_call_jjj: Option>, - pub dyn_call_viiij: Option>, - pub dyn_call_viiijiiii: - Option>, + Option>, + pub dyn_call_iij: Option>, + pub dyn_call_iji: Option>, + pub dyn_call_iiji: Option>, + pub dyn_call_iiijj: Option>, + pub dyn_call_j: Option>, + pub dyn_call_ji: Option>, + pub dyn_call_jii: Option>, + pub dyn_call_jij: Option>, + pub dyn_call_jjj: Option>, + pub dyn_call_viiij: Option>, + pub dyn_call_viiijiiii: Option>, pub dyn_call_viiijiiiiii: - Option>, - pub dyn_call_viij: Option>, - pub dyn_call_viiji: Option>, - pub dyn_call_viijiii: Option>, - pub dyn_call_viijj: Option>, - pub dyn_call_vj: Option>, - pub dyn_call_vjji: Option>, - pub dyn_call_vij: Option>, - pub dyn_call_viji: Option>, - pub dyn_call_vijiii: Option>, - pub dyn_call_vijj: Option>, - pub dyn_call_viid: Option>, - pub dyn_call_vidd: Option>, - pub dyn_call_viidii: Option>, + Option>, + pub dyn_call_viij: Option>, + pub dyn_call_viiji: Option>, + pub dyn_call_viijiii: Option>, + pub dyn_call_viijj: Option>, + pub dyn_call_vj: Option>, + pub dyn_call_vjji: Option>, + pub dyn_call_vij: Option>, + pub dyn_call_viji: Option>, + pub dyn_call_vijiii: Option>, + pub dyn_call_vijj: Option>, + pub dyn_call_viid: Option>, + pub dyn_call_vidd: Option>, + pub dyn_call_viidii: Option>, pub dyn_call_viidddddddd: - Option>, + Option>, pub temp_ret_0: i32, - pub stack_save: Option>, - pub stack_restore: Option>, - pub set_threw: Option>, + pub stack_save: Option>, + pub stack_restore: Option>, + pub set_threw: Option>, pub mapped_dirs: HashMap, }