interpreter constructor with default values

This commit is contained in:
Andrew Dirksen 2018-11-21 09:03:24 -08:00
parent 4b5c2d4a47
commit 94a62c2c20
3 changed files with 22 additions and 30 deletions

View File

@ -1,10 +1,7 @@
use std::error; use std::error;
use std::fs::File; use std::fs::File;
use test::Bencher; use test::Bencher;
use wasmi::{ use wasmi::{FuncInstance, ImportsBuilder, Interpreter, Module, ModuleInstance, NopExternals, RuntimeValue};
FuncInstance, ImportsBuilder, Interpreter, Module, ModuleInstance, NopExternals, RuntimeValue, StackSize,
StackWithLimit,
};
// Load a module from a file. // Load a module from a file.
fn load_from_file(filename: &str) -> Result<Module, Box<error::Error>> { fn load_from_file(filename: &str) -> Result<Module, Box<error::Error>> {
@ -23,12 +20,6 @@ fn load_kernel() -> Module {
const REVCOMP_INPUT: &'static [u8] = include_bytes!("./revcomp-input.txt"); const REVCOMP_INPUT: &'static [u8] = include_bytes!("./revcomp-input.txt");
const REVCOMP_OUTPUT: &'static [u8] = include_bytes!("./revcomp-output.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] #[bench]
fn bench_tiny_keccak(b: &mut Bencher) { fn bench_tiny_keccak(b: &mut Bencher) {
let wasm_kernel = load_kernel(); 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 = instance.export_by_name("bench_tiny_keccak").unwrap();
let func = func.as_func().unwrap(); let func = func.as_func().unwrap();
let mut interpreter = new_interpreter(); let mut interpreter = Interpreter::new();
b.iter(|| { b.iter(|| {
interpreter.reset(); 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 = instance.export_by_name("bench_rev_complement").unwrap();
let func = func.as_func().unwrap(); let func = func.as_func().unwrap();
let mut interpreter = new_interpreter(); let mut interpreter = Interpreter::new();
b.iter(|| { b.iter(|| {
interpreter.reset(); 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 = instance.export_by_name("bench_regex_redux").unwrap();
let func = func.as_func().unwrap(); let func = func.as_func().unwrap();
let mut interpreter = new_interpreter(); let mut interpreter = Interpreter::new();
b.iter(|| { b.iter(|| {
interpreter.reset(); interpreter.reset();
@ -179,7 +170,7 @@ fn fac_recursive(b: &mut Bencher) {
let func = instance.export_by_name("fac-rec").unwrap(); let func = instance.export_by_name("fac-rec").unwrap();
let func = func.as_func().unwrap(); let func = func.as_func().unwrap();
let mut interpreter = new_interpreter(); let mut interpreter = Interpreter::new();
b.iter(|| { b.iter(|| {
interpreter.reset(); interpreter.reset();
@ -219,7 +210,7 @@ fn fac_opt(b: &mut Bencher) {
let func = instance.export_by_name("fac-opt").unwrap(); let func = instance.export_by_name("fac-opt").unwrap();
let func = func.as_func().unwrap(); let func = func.as_func().unwrap();
let mut interpreter = new_interpreter(); let mut interpreter = Interpreter::new();
b.iter(|| { b.iter(|| {
interpreter.reset(); interpreter.reset();
@ -260,7 +251,7 @@ fn recursive_ok(b: &mut Bencher) {
let func = instance.export_by_name("call").unwrap(); let func = instance.export_by_name("call").unwrap();
let func = func.as_func().unwrap(); let func = func.as_func().unwrap();
let mut interpreter = new_interpreter(); let mut interpreter = Interpreter::new();
b.iter(|| { b.iter(|| {
interpreter.reset(); interpreter.reset();
@ -300,7 +291,7 @@ fn recursive_trap(b: &mut Bencher) {
let func = instance.export_by_name("call").unwrap(); let func = instance.export_by_name("call").unwrap();
let func = func.as_func().unwrap(); let func = func.as_func().unwrap();
let mut interpreter = new_interpreter(); let mut interpreter = Interpreter::new();
b.iter(|| { b.iter(|| {
interpreter.reset(); interpreter.reset();

View File

@ -1,13 +1,12 @@
#[allow(unused_imports)] #[allow(unused_imports)]
use alloc::prelude::*; use alloc::prelude::*;
use alloc::rc::{Rc, Weak}; use alloc::rc::{Rc, Weak};
use common::stack::{StackSize, StackWithLimit};
use core::fmt; use core::fmt;
use host::Externals; use host::Externals;
use isa; use isa;
use module::ModuleInstance; use module::ModuleInstance;
use parity_wasm::elements::Local; 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 types::ValueType;
use value::RuntimeValue; use value::RuntimeValue;
use {Signature, Trap}; use {Signature, Trap};
@ -137,9 +136,7 @@ impl FuncInstance {
) -> Result<Option<RuntimeValue>, Trap> { ) -> Result<Option<RuntimeValue>, Trap> {
check_function_args(func.signature(), &args)?; check_function_args(func.signature(), &args)?;
match *func.as_internal() { match *func.as_internal() {
FuncInstanceInternal::Internal { .. } => { FuncInstanceInternal::Internal { .. } => interpreter.start_execution(externals, func, args),
interpreter.start_execution(externals, func, args)
}
FuncInstanceInternal::Host { FuncInstanceInternal::Host {
ref host_func_index, .. ref host_func_index, ..
} => externals.invoke_index(*host_func_index, args.into()), } => externals.invoke_index(*host_func_index, args.into()),
@ -160,9 +157,7 @@ impl FuncInstance {
args: &[RuntimeValue], args: &[RuntimeValue],
externals: &mut E, externals: &mut E,
) -> Result<Option<RuntimeValue>, Trap> { ) -> Result<Option<RuntimeValue>, Trap> {
let value_stack = StackWithLimit::with_size(StackSize::from_element_count(DEFAULT_VALUE_STACK_LIMIT)); let mut interpreter = Interpreter::new();
let call_stack = StackWithLimit::with_size(StackSize::from_element_count(DEFAULT_CALL_STACK_LIMIT));
let mut interpreter = Interpreter::new(value_stack, call_stack);
Self::invoke_configurable(func, args, externals, &mut interpreter) Self::invoke_configurable(func, args, externals, &mut interpreter)
} }
@ -183,9 +178,7 @@ impl FuncInstance {
pub fn invoke_resumable(func: &FuncRef) -> FuncInvocation { pub fn invoke_resumable(func: &FuncRef) -> FuncInvocation {
match *func.as_internal() { match *func.as_internal() {
FuncInstanceInternal::Internal { .. } => { FuncInstanceInternal::Internal { .. } => {
let value_stack = StackWithLimit::with_size(StackSize::from_element_count(DEFAULT_VALUE_STACK_LIMIT)); let interpreter = Interpreter::new();
let call_stack = StackWithLimit::with_size(StackSize::from_element_count(DEFAULT_CALL_STACK_LIMIT));
let interpreter = Interpreter::new(value_stack, call_stack);
FuncInvocation { FuncInvocation {
kind: FuncInvocationKind::Internal(interpreter), kind: FuncInvocationKind::Internal(interpreter),
} }

View File

@ -1,6 +1,6 @@
#[allow(unused_imports)] #[allow(unused_imports)]
use alloc::prelude::*; use alloc::prelude::*;
use common::stack::{StackOverflow, StackWithLimit}; use common::stack::{StackOverflow, StackSize, StackWithLimit};
use common::{DEFAULT_MEMORY_INDEX, DEFAULT_TABLE_INDEX}; use common::{DEFAULT_MEMORY_INDEX, DEFAULT_TABLE_INDEX};
use core::fmt; use core::fmt;
use core::ops; use core::ops;
@ -172,10 +172,18 @@ pub struct Interpreter {
} }
impl 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`. /// Initialize an interpreter that will use `value_stack` and `call_stack`.
/// ///
/// `value_stack` `call_stack` determine the allowed stack size during later executions. /// `value_stack` `call_stack` determine the allowed stack size during later executions.
pub fn new( pub fn with_stacks(
value_stack: StackWithLimit<RuntimeValueInternal>, value_stack: StackWithLimit<RuntimeValueInternal>,
call_stack: StackWithLimit<FunctionContext>, call_stack: StackWithLimit<FunctionContext>,
) -> Interpreter { ) -> Interpreter {