diff --git a/examples/tictactoe.rs b/examples/tictactoe.rs index 197d7a0..29a6cf9 100644 --- a/examples/tictactoe.rs +++ b/examples/tictactoe.rs @@ -5,9 +5,9 @@ use std::fmt; use std::rc::Rc; use parity_wasm::elements::{FunctionType, ValueType, TableType, GlobalType, MemoryType}; use parity_wasm::interpreter::{ - Error as InterpreterError, ModuleInstance, UserError, + Error as InterpreterError, ModuleInstance, UserError, ModuleRef, HostFuncIndex, Externals, RuntimeValue, GlobalInstance, TableInstance, MemoryInstance, - TableRef, MemoryRef, GlobalRef, FuncRef, TryInto, ImportResolver, FuncInstance + TableRef, MemoryRef, GlobalRef, FuncRef, TryInto, ImportResolver, FuncInstance, }; use parity_wasm::elements::{Error as DeserializationError}; use parity_wasm::ValidationError; @@ -260,7 +260,7 @@ impl<'a> ImportResolver for RuntimeImportResolver { fn instantiate( path: &str, -) -> Result, Error> { +) -> Result { let module = parity_wasm::deserialize_file(path)?; let validated_module = parity_wasm::validate_module(module)?; @@ -272,8 +272,8 @@ fn instantiate( } fn play( - x_instance: Rc, - o_instance: Rc, + x_instance: ModuleRef, + o_instance: ModuleRef, game: &mut tictactoe::Game, ) -> Result { let mut turn_of = tictactoe::Player::X; diff --git a/src/interpreter/func.rs b/src/interpreter/func.rs index 8d4e3ec..2f9dc9e 100644 --- a/src/interpreter/func.rs +++ b/src/interpreter/func.rs @@ -3,10 +3,11 @@ use std::fmt; use std::collections::HashMap; use std::borrow::Cow; use elements::{FunctionType, Local, Opcodes}; -use interpreter::{Error, ModuleInstance}; +use interpreter::Error; use interpreter::host::{Externals, HostFuncIndex}; use interpreter::runner::{prepare_function_args, FunctionContext, Interpreter}; use interpreter::value::RuntimeValue; +use interpreter::module::ModuleRef; use common::stack::StackWithLimit; use common::{DEFAULT_FRAME_STACK_LIMIT, DEFAULT_VALUE_STACK_LIMIT}; @@ -24,7 +25,7 @@ impl ::std::ops::Deref for FuncRef { pub enum FuncInstance { Internal { func_type: Rc, - module: Rc, + module: ModuleRef, body: Rc, }, Host { @@ -57,7 +58,7 @@ impl fmt::Debug for FuncInstance { impl FuncInstance { pub(crate) fn alloc_internal( - module: Rc, + module: ModuleRef, func_type: Rc, body: FuncBody, ) -> FuncRef { diff --git a/src/interpreter/mod.rs b/src/interpreter/mod.rs index 9d25eb3..0b3fb27 100644 --- a/src/interpreter/mod.rs +++ b/src/interpreter/mod.rs @@ -156,6 +156,6 @@ pub use self::program::ProgramInstance; pub use self::value::{RuntimeValue, TryInto}; pub use self::host::{Externals, HostFuncIndex, EmptyExternals}; pub use self::imports::{ImportResolver, Imports}; -pub use self::module::ModuleInstance; +pub use self::module::{ModuleInstance, ModuleRef}; pub use self::global::{GlobalInstance, GlobalRef}; pub use self::func::{FuncInstance, FuncRef}; diff --git a/src/interpreter/module.rs b/src/interpreter/module.rs index e3471a9..2b0b570 100644 --- a/src/interpreter/module.rs +++ b/src/interpreter/module.rs @@ -15,6 +15,8 @@ use interpreter::host::Externals; use validation::ValidatedModule; use common::{DEFAULT_MEMORY_INDEX, DEFAULT_TABLE_INDEX}; +pub type ModuleRef = Rc; + pub enum ExternVal { Func(FuncRef), Table(TableRef), @@ -159,7 +161,7 @@ impl ModuleInstance { fn alloc_module_non_func_items( validated_module: &ValidatedModule, extern_vals: &[ExternVal], - ) -> Result, Error> { + ) -> Result { let module = validated_module.module(); let mut module_ref = Rc::new(ModuleInstance::default()); @@ -297,7 +299,7 @@ impl ModuleInstance { fn alloc_module( validated_module: &ValidatedModule, extern_vals: &[ExternVal] - ) -> Result, Error> { + ) -> Result { // Step 1: Allocate all items except functions. let module_ref = Self::alloc_module_non_func_items(validated_module, extern_vals)?; @@ -341,7 +343,7 @@ impl ModuleInstance { fn instantiate_with_externvals( validated_module: &ValidatedModule, extern_vals: &[ExternVal], - ) -> Result, Error> { + ) -> Result { let module = validated_module.module(); let module_ref = ModuleInstance::alloc_module(validated_module, extern_vals)?; @@ -385,7 +387,7 @@ impl ModuleInstance { fn instantiate_with_imports( validated_module: &ValidatedModule, imports: &Imports, - ) -> Result, Error> { + ) -> Result { let module = validated_module.module(); let mut extern_vals = Vec::new(); @@ -499,7 +501,7 @@ impl<'a> InstantiationBuilder<'a> { self } - pub fn run_start<'b, E: Externals>(mut self, state: &'b mut E) -> Result, Error> { + pub fn run_start<'b, E: Externals>(mut self, state: &'b mut E) -> Result { let imports = self.imports.get_or_insert_with(|| Imports::default()); let instance = ModuleInstance::instantiate_with_imports(self.validated_module, imports)?; @@ -512,7 +514,7 @@ impl<'a> InstantiationBuilder<'a> { Ok(instance) } - pub fn assert_no_start(mut self) -> Result, Error> { + pub fn assert_no_start(mut self) -> Result { assert!(self.validated_module.module().start_section().is_none()); let imports = self.imports.get_or_insert_with(|| Imports::default()); let instance = ModuleInstance::instantiate_with_imports(self.validated_module, imports)?; diff --git a/src/interpreter/program.rs b/src/interpreter/program.rs index 28bfe58..b33a01d 100644 --- a/src/interpreter/program.rs +++ b/src/interpreter/program.rs @@ -3,7 +3,7 @@ use std::collections::HashMap; use std::borrow::Cow; use elements::Module; use interpreter::Error; -use interpreter::module::{ModuleInstance}; +use interpreter::module::{ModuleInstance, ModuleRef}; use interpreter::func::{FuncInstance, FuncRef}; use interpreter::value::RuntimeValue; use interpreter::imports::{Imports, ImportResolver}; @@ -13,7 +13,7 @@ use validation::validate_module; /// Program instance. Program is a set of instantiated modules. #[deprecated] pub struct ProgramInstance { - modules: HashMap>, + modules: HashMap, resolvers: HashMap>, } @@ -32,7 +32,7 @@ impl ProgramInstance { name: &str, module: Module, externals: &'a mut E, - ) -> Result, Error> { + ) -> Result { let module_instance = { let mut imports = Imports::new(); for (module_name, module_instance) in self.modules.iter() { @@ -59,7 +59,7 @@ impl ProgramInstance { self.resolvers.insert(name.to_owned(), import_resolver); } - pub fn insert_loaded_module(&mut self, name: &str, module: Rc) { + pub fn insert_loaded_module(&mut self, name: &str, module: ModuleRef) { self.modules.insert(name.to_owned(), module); } @@ -105,7 +105,7 @@ impl ProgramInstance { .or_else(|| self.resolvers.get(name).map(|x| &**x)) } - pub fn module(&self, name: &str) -> Option> { + pub fn module(&self, name: &str) -> Option { self.modules.get(name).cloned() } } diff --git a/src/interpreter/runner.rs b/src/interpreter/runner.rs index 2d9bfc7..e95e871 100644 --- a/src/interpreter/runner.rs +++ b/src/interpreter/runner.rs @@ -7,7 +7,7 @@ use std::iter::repeat; use std::collections::{HashMap, VecDeque}; use elements::{Opcode, BlockType, Local, FunctionType}; use interpreter::Error; -use interpreter::module::ModuleInstance; +use interpreter::module::ModuleRef; use interpreter::func::FuncRef; use interpreter::func::FuncInstance; use interpreter::value::{ @@ -29,7 +29,7 @@ pub struct FunctionContext { pub is_initialized: bool, /// Internal function reference. pub function: FuncRef, - pub module: Rc, + pub module: ModuleRef, /// Function return type. pub return_type: BlockType, /// Local variables. @@ -1057,7 +1057,7 @@ impl FunctionContext { self.locals.extend(locals); } - pub fn module(&self) -> Rc { + pub fn module(&self) -> ModuleRef { Rc::clone(&self.module) }