mirror of
https://github.com/fluencelabs/wasmer
synced 2025-06-22 21:21:33 +00:00
feat(runtime-core) Ability for an export function to get a func env.
This commit is contained in:
@ -600,11 +600,11 @@ fn import_functions(
|
||||
vmctx_
|
||||
}
|
||||
}
|
||||
_ => vmctx,
|
||||
Context::Internal => vmctx,
|
||||
})
|
||||
.expect("`vmctx` must not be null."),
|
||||
func_env: match ctx {
|
||||
Context::ExternalWithEnv(_, func_env) => Some(func_env),
|
||||
Context::ExternalWithEnv(_, func_env) => func_env,
|
||||
_ => None,
|
||||
},
|
||||
})))
|
||||
|
@ -8,7 +8,7 @@ use std::{ptr::NonNull, sync::Arc};
|
||||
#[derive(Debug, Copy, Clone)]
|
||||
pub enum Context {
|
||||
External(*mut vm::Ctx),
|
||||
ExternalWithEnv(*mut vm::Ctx, NonNull<vm::FuncEnv>),
|
||||
ExternalWithEnv(*mut vm::Ctx, Option<NonNull<vm::FuncEnv>>),
|
||||
Internal,
|
||||
}
|
||||
|
||||
|
@ -133,7 +133,7 @@ impl Instance {
|
||||
.expect("wasm trampoline");
|
||||
|
||||
let start_func: Func<(), (), Wasm> =
|
||||
unsafe { Func::from_raw_parts(wasm_trampoline, func_ptr, ctx_ptr) };
|
||||
unsafe { Func::from_raw_parts(wasm_trampoline, func_ptr, None, ctx_ptr) };
|
||||
|
||||
start_func.call()?;
|
||||
}
|
||||
@ -214,20 +214,26 @@ impl Instance {
|
||||
.get_trampoline(&self.module.info, sig_index)
|
||||
.unwrap();
|
||||
|
||||
let func_ptr = match func_index.local_or_import(&self.module.info) {
|
||||
LocalOrImport::Local(local_func_index) => self
|
||||
.module
|
||||
let (func_ptr, func_env) = match func_index.local_or_import(&self.module.info) {
|
||||
LocalOrImport::Local(local_func_index) => (
|
||||
self.module
|
||||
.runnable_module
|
||||
.get_func(&self.module.info, local_func_index)
|
||||
.unwrap(),
|
||||
LocalOrImport::Import(import_func_index) => NonNull::new(
|
||||
self.inner.import_backing.vm_functions[import_func_index].func as *mut _,
|
||||
None,
|
||||
),
|
||||
LocalOrImport::Import(import_func_index) => {
|
||||
let imported_func = &self.inner.import_backing.vm_functions[import_func_index];
|
||||
|
||||
(
|
||||
NonNull::new(imported_func.func as *mut _).unwrap(),
|
||||
unsafe { imported_func.func_ctx.as_ref() }.func_env,
|
||||
)
|
||||
.unwrap(),
|
||||
}
|
||||
};
|
||||
|
||||
let typed_func: Func<Args, Rets, Wasm> =
|
||||
unsafe { Func::from_raw_parts(func_wasm_inner, func_ptr, ctx) };
|
||||
unsafe { Func::from_raw_parts(func_wasm_inner, func_ptr, func_env, ctx) };
|
||||
|
||||
Ok(typed_func)
|
||||
} else {
|
||||
@ -413,7 +419,7 @@ impl InstanceInner {
|
||||
ctx: match ctx {
|
||||
Context::Internal => Context::External(self.vmctx),
|
||||
ctx @ Context::External(_) => ctx,
|
||||
func_ctx @ Context::ExternalWithEnv(_, _) => func_ctx,
|
||||
ctx @ Context::ExternalWithEnv(_, _) => ctx,
|
||||
},
|
||||
signature,
|
||||
}
|
||||
@ -456,9 +462,11 @@ impl InstanceInner {
|
||||
),
|
||||
LocalOrImport::Import(imported_func_index) => {
|
||||
let imported_func = &self.import_backing.vm_functions[imported_func_index];
|
||||
let func_ctx = unsafe { imported_func.func_ctx.as_ref() };
|
||||
|
||||
(
|
||||
imported_func.func as *const _,
|
||||
Context::External(unsafe { imported_func.func_ctx.as_ref() }.vmctx.as_ptr()),
|
||||
Context::ExternalWithEnv(func_ctx.vmctx.as_ptr(), func_ctx.func_env),
|
||||
)
|
||||
}
|
||||
};
|
||||
|
@ -227,12 +227,13 @@ where
|
||||
pub(crate) unsafe fn from_raw_parts(
|
||||
inner: Wasm,
|
||||
func: NonNull<vm::Func>,
|
||||
func_env: Option<NonNull<vm::FuncEnv>>,
|
||||
vmctx: *mut vm::Ctx,
|
||||
) -> Func<'a, Args, Rets, Wasm> {
|
||||
Func {
|
||||
inner,
|
||||
func,
|
||||
func_env: None,
|
||||
func_env,
|
||||
vmctx,
|
||||
_phantom: PhantomData,
|
||||
}
|
||||
@ -724,7 +725,7 @@ where
|
||||
fn to_export(&self) -> Export {
|
||||
let func = unsafe { FuncPointer::new(self.func.as_ptr()) };
|
||||
let ctx = match self.func_env {
|
||||
Some(func_env) => Context::ExternalWithEnv(self.vmctx, func_env),
|
||||
func_env @ Some(_) => Context::ExternalWithEnv(self.vmctx, func_env),
|
||||
None => Context::Internal,
|
||||
};
|
||||
let signature = Arc::new(FuncSig::new(Args::types(), Rets::types()));
|
||||
|
Reference in New Issue
Block a user