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::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<Module, Box<error::Error>> {
@ -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();

View File

@ -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<Option<RuntimeValue>, 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<Option<RuntimeValue>, 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),
}

View File

@ -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<RuntimeValueInternal>,
call_stack: StackWithLimit<FunctionContext>,
) -> Interpreter {