mirror of
https://github.com/fluencelabs/parity-wasm
synced 2025-06-30 07:02:43 +00:00
Make Program work thru Imports
This commit is contained in:
@ -11,6 +11,12 @@ pub struct Imports<'a> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> Imports<'a> {
|
impl<'a> Imports<'a> {
|
||||||
|
pub fn new() -> Imports<'a> {
|
||||||
|
Imports {
|
||||||
|
modules: HashMap::new(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn with_resolver<N: Into<String>>(mut self, name: N, resolver: &'a ImportResolver) -> Imports<'a> {
|
pub fn with_resolver<N: Into<String>>(mut self, name: N, resolver: &'a ImportResolver) -> Imports<'a> {
|
||||||
self.modules.insert(name.into(), resolver);
|
self.modules.insert(name.into(), resolver);
|
||||||
self
|
self
|
||||||
|
@ -5,6 +5,7 @@ use interpreter::Error;
|
|||||||
use interpreter::store::{FuncInstance, ModuleInstance};
|
use interpreter::store::{FuncInstance, ModuleInstance};
|
||||||
use interpreter::host::HostModule;
|
use interpreter::host::HostModule;
|
||||||
use interpreter::value::RuntimeValue;
|
use interpreter::value::RuntimeValue;
|
||||||
|
use interpreter::imports::Imports;
|
||||||
|
|
||||||
/// Program instance. Program is a set of instantiated modules.
|
/// Program instance. Program is a set of instantiated modules.
|
||||||
pub struct ProgramInstance {
|
pub struct ProgramInstance {
|
||||||
@ -26,22 +27,13 @@ impl ProgramInstance {
|
|||||||
module: Module,
|
module: Module,
|
||||||
state: &mut St,
|
state: &mut St,
|
||||||
) -> Result<Rc<ModuleInstance>, Error> {
|
) -> Result<Rc<ModuleInstance>, Error> {
|
||||||
let mut externvals = Vec::new();
|
let module_instance = {
|
||||||
for import_entry in module.import_section().map(|s| s.entries()).unwrap_or(&[]) {
|
let mut imports = Imports::new();
|
||||||
let module = self.modules.get(import_entry.module()).ok_or_else(|| Error::Program(format!("Module {} not found", import_entry.module())))?;
|
for (module_name, module_instance) in self.modules.iter() {
|
||||||
let externval = module
|
imports.push_resolver(&**module_name, &**module_instance);
|
||||||
.export_by_name(import_entry.field())
|
}
|
||||||
.ok_or_else(|| {
|
ModuleInstance::instantiate(&module, &imports, state)?
|
||||||
Error::Program(format!(
|
};
|
||||||
"Module {} doesn't have export {}",
|
|
||||||
import_entry.module(),
|
|
||||||
import_entry.field()
|
|
||||||
))
|
|
||||||
})?;
|
|
||||||
externvals.push(externval);
|
|
||||||
}
|
|
||||||
|
|
||||||
let module_instance = ModuleInstance::instantiate_with_externvals(&module, &externvals, state)?;
|
|
||||||
self.modules.insert(name.to_owned(), Rc::clone(&module_instance));
|
self.modules.insert(name.to_owned(), Rc::clone(&module_instance));
|
||||||
|
|
||||||
Ok(module_instance)
|
Ok(module_instance)
|
||||||
|
Reference in New Issue
Block a user