mirror of
https://github.com/fluencelabs/wasmer
synced 2025-06-27 23:51:33 +00:00
Add imported tables
This commit is contained in:
@ -188,15 +188,11 @@ impl ImportBacking {
|
|||||||
imports: &Imports,
|
imports: &Imports,
|
||||||
vmctx: *mut vm::Ctx,
|
vmctx: *mut vm::Ctx,
|
||||||
) -> Result<Self, String> {
|
) -> Result<Self, String> {
|
||||||
assert!(
|
|
||||||
module.imported_tables.len() == 0,
|
|
||||||
"imported tables not yet supported"
|
|
||||||
);
|
|
||||||
|
|
||||||
Ok(ImportBacking {
|
Ok(ImportBacking {
|
||||||
functions: import_functions(module, imports, vmctx)?,
|
functions: import_functions(module, imports, vmctx)?,
|
||||||
memories: import_memories(module, imports, vmctx)?,
|
memories: import_memories(module, imports, vmctx)?,
|
||||||
tables: vec![].into_boxed_slice(),
|
tables: import_tables(module, imports, vmctx)?,
|
||||||
globals: import_globals(module, imports)?,
|
globals: import_globals(module, imports)?,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@ -246,6 +242,50 @@ fn import_memories(
|
|||||||
Ok(memories.into_boxed_slice())
|
Ok(memories.into_boxed_slice())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn import_tables(
|
||||||
|
module: &ModuleInner,
|
||||||
|
imports: &Imports,
|
||||||
|
vmctx: *mut vm::Ctx,
|
||||||
|
) -> Result<Box<[vm::ImportedTable]>, String> {
|
||||||
|
let mut tables = Vec::with_capacity(module.imported_tables.len());
|
||||||
|
for (_index, (ImportName { namespace, name }, expected_table_desc)) in
|
||||||
|
&module.imported_tables
|
||||||
|
{
|
||||||
|
let table_import = imports
|
||||||
|
.get_namespace(namespace)
|
||||||
|
.and_then(|namespace| namespace.get_export(name));
|
||||||
|
match table_import {
|
||||||
|
Some(Export::Table {
|
||||||
|
local,
|
||||||
|
ctx,
|
||||||
|
table: table_desc,
|
||||||
|
}) => {
|
||||||
|
if expected_table_desc.fits_in_imported(&table_desc) {
|
||||||
|
tables.push(vm::ImportedTable {
|
||||||
|
table: local.inner(),
|
||||||
|
vmctx: match ctx {
|
||||||
|
Context::External(ctx) => ctx,
|
||||||
|
Context::Internal => vmctx,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
return Err(format!(
|
||||||
|
"incorrect table description for {}:{}",
|
||||||
|
namespace, name,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Some(_) => {
|
||||||
|
return Err(format!("incorrect import type for {}:{}", namespace, name));
|
||||||
|
}
|
||||||
|
None => {
|
||||||
|
return Err(format!("import not found: {}:{}", namespace, name));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Ok(tables.into_boxed_slice())
|
||||||
|
}
|
||||||
|
|
||||||
fn import_functions(
|
fn import_functions(
|
||||||
module: &ModuleInner,
|
module: &ModuleInner,
|
||||||
imports: &Imports,
|
imports: &Imports,
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
use crate::recovery::call_protected;
|
use crate::recovery::call_protected;
|
||||||
use crate::{
|
use crate::{
|
||||||
backing::{ImportBacking, LocalBacking},
|
backing::{ImportBacking, LocalBacking},
|
||||||
export::{Context, Export, ExportIter, FuncPointer, MemoryPointer},
|
export::{Context, Export, ExportIter, FuncPointer, MemoryPointer, TablePointer},
|
||||||
import::{Imports, Namespace},
|
import::{Imports, Namespace},
|
||||||
module::{ExportIndex, Module, ModuleInner},
|
module::{ExportIndex, Module, ModuleInner},
|
||||||
types::{FuncIndex, FuncSig, MapIndex, Memory, MemoryIndex, Type, Value},
|
types::{FuncIndex, FuncSig, MapIndex, Memory, MemoryIndex, Table, TableIndex, Type, Value},
|
||||||
vm,
|
vm,
|
||||||
};
|
};
|
||||||
use libffi::high::{arg as libffi_arg, call as libffi_call, CodePtr};
|
use libffi::high::{arg as libffi_arg, call as libffi_call, CodePtr};
|
||||||
@ -168,7 +168,19 @@ impl Instance {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
ExportIndex::Global(_global_index) => unimplemented!(),
|
ExportIndex::Global(_global_index) => unimplemented!(),
|
||||||
ExportIndex::Table(_table_index) => unimplemented!(),
|
ExportIndex::Table(table_index) => {
|
||||||
|
let (local, ctx, table) = self.get_table_from_index(*table_index);
|
||||||
|
Export::Table {
|
||||||
|
local,
|
||||||
|
ctx: match ctx {
|
||||||
|
Context::Internal => {
|
||||||
|
Context::External(&*self.inner.vmctx as *const vm::Ctx as *mut vm::Ctx)
|
||||||
|
}
|
||||||
|
ctx @ Context::External(_) => ctx,
|
||||||
|
},
|
||||||
|
table,
|
||||||
|
}
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -229,6 +241,35 @@ impl Instance {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn get_table_from_index(&self, table_index: TableIndex) -> (TablePointer, Context, Table) {
|
||||||
|
if self.module.is_imported_table(table_index) {
|
||||||
|
let &(_, tab) = &self
|
||||||
|
.module
|
||||||
|
.imported_tables
|
||||||
|
.get(table_index)
|
||||||
|
.expect("missing imported table index");
|
||||||
|
let vm::ImportedTable { table, vmctx } =
|
||||||
|
&self.inner.import_backing.tables[table_index.index()];
|
||||||
|
(
|
||||||
|
unsafe { TablePointer::new(*table) },
|
||||||
|
Context::External(*vmctx),
|
||||||
|
*tab,
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
unimplemented!(); // TODO into_vm_tables requires &mut self
|
||||||
|
// let vm_table = &self.inner.backing.tables[table_index.index() as usize];
|
||||||
|
// (
|
||||||
|
// unsafe { TablePointer::new(&mut vm_table.into_vm_table()) },
|
||||||
|
// Context::Internal,
|
||||||
|
// *self
|
||||||
|
// .module
|
||||||
|
// .tables
|
||||||
|
// .get(table_index)
|
||||||
|
// .expect("broken invariant, tables"),
|
||||||
|
// )
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Namespace for Instance {
|
impl Namespace for Instance {
|
||||||
|
@ -56,6 +56,10 @@ impl ModuleInner {
|
|||||||
pub(crate) fn is_imported_memory(&self, memory_index: MemoryIndex) -> bool {
|
pub(crate) fn is_imported_memory(&self, memory_index: MemoryIndex) -> bool {
|
||||||
memory_index.index() < self.imported_memories.len()
|
memory_index.index() < self.imported_memories.len()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub(crate) fn is_imported_table(&self, table_index: TableIndex) -> bool {
|
||||||
|
table_index.index() < self.imported_tables.len()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[doc(hidden)]
|
#[doc(hidden)]
|
||||||
|
@ -80,6 +80,12 @@ pub struct Table {
|
|||||||
pub max: Option<u32>,
|
pub max: Option<u32>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Table {
|
||||||
|
pub(crate) fn fits_in_imported(&self, imported: &Table) -> bool {
|
||||||
|
self.max == imported.max && self.min <= imported.min
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// A global value initializer.
|
/// A global value initializer.
|
||||||
/// Overtime, this will be able to represent more and more
|
/// Overtime, this will be able to represent more and more
|
||||||
/// complex expressions.
|
/// complex expressions.
|
||||||
|
Reference in New Issue
Block a user