diff --git a/benches/src/reuse.rs b/benches/src/reuse.rs index 38a3736..8fa42bd 100644 --- a/benches/src/reuse.rs +++ b/benches/src/reuse.rs @@ -1,10 +1,7 @@ use std::error; use std::fs::File; use test::Bencher; -use wasmi::{ - FuncInstance, ImportsBuilder, Interpreter, Module, ModuleInstance, NopExternals, RuntimeValue, StackSize, - StackWithLimit, -}; +use wasmi::{FuncInstance, ImportsBuilder, Interpreter, Module, ModuleInstance, NopExternals, RuntimeValue}; // Load a module from a file. fn load_from_file(filename: &str) -> Result> { @@ -23,12 +20,6 @@ fn load_kernel() -> Module { const REVCOMP_INPUT: &'static [u8] = include_bytes!("./revcomp-input.txt"); const REVCOMP_OUTPUT: &'static [u8] = include_bytes!("./revcomp-output.txt"); -fn new_interpreter() -> Interpreter { - let value_stack = StackWithLimit::with_size(StackSize::from_element_count(1024 * 1024)); - let call_stack = StackWithLimit::with_size(StackSize::from_element_count(1024 * 1024)); - Interpreter::new(value_stack, call_stack) -} - #[bench] fn bench_tiny_keccak(b: &mut Bencher) { let wasm_kernel = load_kernel(); @@ -44,7 +35,7 @@ fn bench_tiny_keccak(b: &mut Bencher) { let func = instance.export_by_name("bench_tiny_keccak").unwrap(); let func = func.as_func().unwrap(); - let mut interpreter = new_interpreter(); + let mut interpreter = Interpreter::new(); b.iter(|| { interpreter.reset(); @@ -90,7 +81,7 @@ fn bench_rev_comp(b: &mut Bencher) { let func = instance.export_by_name("bench_rev_complement").unwrap(); let func = func.as_func().unwrap(); - let mut interpreter = new_interpreter(); + let mut interpreter = Interpreter::new(); b.iter(|| { interpreter.reset(); @@ -147,7 +138,7 @@ fn bench_regex_redux(b: &mut Bencher) { let func = instance.export_by_name("bench_regex_redux").unwrap(); let func = func.as_func().unwrap(); - let mut interpreter = new_interpreter(); + let mut interpreter = Interpreter::new(); b.iter(|| { interpreter.reset(); @@ -179,7 +170,7 @@ fn fac_recursive(b: &mut Bencher) { let func = instance.export_by_name("fac-rec").unwrap(); let func = func.as_func().unwrap(); - let mut interpreter = new_interpreter(); + let mut interpreter = Interpreter::new(); b.iter(|| { interpreter.reset(); @@ -219,7 +210,7 @@ fn fac_opt(b: &mut Bencher) { let func = instance.export_by_name("fac-opt").unwrap(); let func = func.as_func().unwrap(); - let mut interpreter = new_interpreter(); + let mut interpreter = Interpreter::new(); b.iter(|| { interpreter.reset(); @@ -260,7 +251,7 @@ fn recursive_ok(b: &mut Bencher) { let func = instance.export_by_name("call").unwrap(); let func = func.as_func().unwrap(); - let mut interpreter = new_interpreter(); + let mut interpreter = Interpreter::new(); b.iter(|| { interpreter.reset(); @@ -300,7 +291,7 @@ fn recursive_trap(b: &mut Bencher) { let func = instance.export_by_name("call").unwrap(); let func = func.as_func().unwrap(); - let mut interpreter = new_interpreter(); + let mut interpreter = Interpreter::new(); b.iter(|| { interpreter.reset(); diff --git a/src/func.rs b/src/func.rs index 31270fc..09879cd 100644 --- a/src/func.rs +++ b/src/func.rs @@ -1,13 +1,12 @@ #[allow(unused_imports)] use alloc::prelude::*; use alloc::rc::{Rc, Weak}; -use common::stack::{StackSize, StackWithLimit}; use core::fmt; use host::Externals; use isa; use module::ModuleInstance; use parity_wasm::elements::Local; -use runner::{check_function_args, Interpreter, InterpreterState, DEFAULT_CALL_STACK_LIMIT, DEFAULT_VALUE_STACK_LIMIT}; +use runner::{check_function_args, Interpreter, InterpreterState}; use types::ValueType; use value::RuntimeValue; use {Signature, Trap}; @@ -137,9 +136,7 @@ impl FuncInstance { ) -> Result, Trap> { check_function_args(func.signature(), &args)?; match *func.as_internal() { - FuncInstanceInternal::Internal { .. } => { - interpreter.start_execution(externals, func, args) - } + FuncInstanceInternal::Internal { .. } => interpreter.start_execution(externals, func, args), FuncInstanceInternal::Host { ref host_func_index, .. } => externals.invoke_index(*host_func_index, args.into()), @@ -160,9 +157,7 @@ impl FuncInstance { args: &[RuntimeValue], externals: &mut E, ) -> Result, Trap> { - let value_stack = StackWithLimit::with_size(StackSize::from_element_count(DEFAULT_VALUE_STACK_LIMIT)); - let call_stack = StackWithLimit::with_size(StackSize::from_element_count(DEFAULT_CALL_STACK_LIMIT)); - let mut interpreter = Interpreter::new(value_stack, call_stack); + let mut interpreter = Interpreter::new(); Self::invoke_configurable(func, args, externals, &mut interpreter) } @@ -183,9 +178,7 @@ impl FuncInstance { pub fn invoke_resumable(func: &FuncRef) -> FuncInvocation { match *func.as_internal() { FuncInstanceInternal::Internal { .. } => { - let value_stack = StackWithLimit::with_size(StackSize::from_element_count(DEFAULT_VALUE_STACK_LIMIT)); - let call_stack = StackWithLimit::with_size(StackSize::from_element_count(DEFAULT_CALL_STACK_LIMIT)); - let interpreter = Interpreter::new(value_stack, call_stack); + let interpreter = Interpreter::new(); FuncInvocation { kind: FuncInvocationKind::Internal(interpreter), } diff --git a/src/runner.rs b/src/runner.rs index ef37582..97ba7f3 100644 --- a/src/runner.rs +++ b/src/runner.rs @@ -1,6 +1,6 @@ #[allow(unused_imports)] use alloc::prelude::*; -use common::stack::{StackOverflow, StackWithLimit}; +use common::stack::{StackOverflow, StackSize, StackWithLimit}; use common::{DEFAULT_MEMORY_INDEX, DEFAULT_TABLE_INDEX}; use core::fmt; use core::ops; @@ -172,10 +172,18 @@ pub struct Interpreter { } impl Interpreter { + /// Initialize an interpreter with defaults stack sizes. + pub fn new() -> Interpreter { + Interpreter::with_stacks( + StackWithLimit::with_size(StackSize::from_element_count(DEFAULT_VALUE_STACK_LIMIT)), + StackWithLimit::with_size(StackSize::from_element_count(DEFAULT_CALL_STACK_LIMIT)), + ) + } + /// Initialize an interpreter that will use `value_stack` and `call_stack`. /// /// `value_stack` `call_stack` determine the allowed stack size during later executions. - pub fn new( + pub fn with_stacks( value_stack: StackWithLimit, call_stack: StackWithLimit, ) -> Interpreter {