From 14ddcfd153c45bb06dfbec7389d7377546e31b96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felix=20Sch=C3=BCtt?= Date: Fri, 26 Aug 2022 18:44:25 +0200 Subject: [PATCH] Fix all errors up to the last one --- lib/api/src/js/error.rs | 4 ++++ lib/api/src/js/imports.rs | 2 +- lib/api/src/js/instance.rs | 29 ++++++----------------------- 3 files changed, 11 insertions(+), 24 deletions(-) diff --git a/lib/api/src/js/error.rs b/lib/api/src/js/error.rs index a999a4235f8..23df188dcc5 100644 --- a/lib/api/src/js/error.rs +++ b/lib/api/src/js/error.rs @@ -199,6 +199,10 @@ pub enum InstantiationError { /// A generic error occured while invoking API functions #[cfg_attr(feature = "std", error(transparent))] Wasm(WasmError), + + /// Insufficient resources available for execution. + #[cfg_attr(feature = "std", error("Can't get {0} from the instance exports"))] + NotInExports(String), } impl From for InstantiationError { diff --git a/lib/api/src/js/imports.rs b/lib/api/src/js/imports.rs index 8b4b3ad954a..aad247c0c8f 100644 --- a/lib/api/src/js/imports.rs +++ b/lib/api/src/js/imports.rs @@ -1,7 +1,7 @@ //! The import module contains the implementation data structures and helper functions used to //! manipulate and access a wasm module's imports including memories, tables, globals, and //! functions. -use crate::js::error::{InstantiationError, LinkError}; +use crate::js::error::LinkError; use crate::js::exports::Exports; use crate::js::module::Module; use crate::js::store::AsStoreRef; diff --git a/lib/api/src/js/instance.rs b/lib/api/src/js/instance.rs index 7ee379a7504..8a1e73cb2fe 100644 --- a/lib/api/src/js/instance.rs +++ b/lib/api/src/js/instance.rs @@ -90,25 +90,11 @@ impl Instance { module: &Module, externs: &[Extern], ) -> Result { - let imports = externs.to_vec(); - let mut handle = module.instantiate(store, &imports)?; - let exports = module - .exports() - .map(|export| { - let name = export.name().to_string(); - let export = handle.lookup(&name).expect("export"); - let extern_ = Extern::from_vm_extern(store, export); - (name, extern_) - }) - .collect::(); - - let instance = Self { - _handle: StoreHandle::new(store.objects_mut(), handle), - module: module.clone(), - exports, - }; - - Ok(instance) + let mut imports = Imports::new(); + for (import_ty, extern_ty) in module.imports().zip(externs.iter()) { + imports.define(import_ty.module(), import_ty.name(), extern_ty.clone()); + } + Self::new(store, module, &imports) } /// Creates a Wasmer `Instance` from a Wasmer `Module` and a WebAssembly Instance @@ -134,10 +120,7 @@ impl Instance { let extern_type = export_type.ty().clone(); let js_export = js_sys::Reflect::get(&instance_exports, &name.into()).map_err(|_e| { - InstantiationError::Link(format!( - "Can't get {} from the instance exports", - &name - )) + InstantiationError::NotInExports(name.to_string()) })?; let export: Export = Export::from_js_value(js_export, &mut store, extern_type)?.into();