mirror of
https://github.com/fluencelabs/wasmer
synced 2025-06-22 05:01:33 +00:00
Make function imports unsafe
This commit is contained in:
@ -2,7 +2,7 @@ use wasmer_clif_backend::CraneliftCompiler;
|
||||
use wasmer_runtime::{
|
||||
self as runtime,
|
||||
types::{FuncSig, Type, Value},
|
||||
vm, Import, Imports,
|
||||
vm, Import, Imports, FuncRef,
|
||||
};
|
||||
|
||||
static EXAMPLE_WASM: &'static [u8] = include_bytes!("simple.wasm");
|
||||
@ -15,7 +15,7 @@ fn main() -> Result<(), String> {
|
||||
"env".to_string(),
|
||||
"print_num".to_string(),
|
||||
Import::Func(
|
||||
print_num as _,
|
||||
unsafe { FuncRef::new(print_num as _) },
|
||||
FuncSig {
|
||||
params: vec![Type::I32],
|
||||
returns: vec![Type::I32],
|
||||
|
@ -263,10 +263,10 @@ impl ImportBacking {
|
||||
let expected_sig = module.sig_registry.lookup_func_sig(sig_index);
|
||||
let import = imports.get(mod_name, item_name);
|
||||
match import {
|
||||
Some(&Import::Func(func, ref signature)) => {
|
||||
Some(&Import::Func(ref func, ref signature)) => {
|
||||
if expected_sig == signature {
|
||||
functions.push(vm::ImportedFunc {
|
||||
func,
|
||||
func: func.inner(),
|
||||
// vmctx: ptr::null_mut(),
|
||||
});
|
||||
} else {
|
||||
|
@ -134,9 +134,25 @@ impl Instance {
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct FuncRef(*const vm::Func);
|
||||
|
||||
impl FuncRef {
|
||||
/// This needs to be unsafe because there is
|
||||
/// no way to check whether the passed function
|
||||
/// is valid and has the right signature.
|
||||
pub unsafe fn new(f: *const vm::Func) -> Self {
|
||||
FuncRef(f)
|
||||
}
|
||||
|
||||
pub(crate) fn inner(&self) -> *const vm::Func {
|
||||
self.0
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub enum Import {
|
||||
Func(*const vm::Func, FuncSig),
|
||||
Func(FuncRef, FuncSig),
|
||||
Table(Arc<TableBacking>, Table),
|
||||
Memory(Arc<LinearMemory>, Memory),
|
||||
Global(Value),
|
||||
|
@ -15,7 +15,7 @@ pub mod vm;
|
||||
pub mod vmcalls;
|
||||
|
||||
pub use self::backend::{Compiler, FuncResolver};
|
||||
pub use self::instance::{Import, ImportResolver, Imports, Instance};
|
||||
pub use self::instance::{Import, ImportResolver, Imports, FuncRef, Instance};
|
||||
pub use self::memory::LinearMemory;
|
||||
pub use self::module::{Module, ModuleInner};
|
||||
pub use self::sig_registry::SigRegistry;
|
||||
|
Reference in New Issue
Block a user