interpreter constructor with default values
This commit is contained in:
parent
4b5c2d4a47
commit
94a62c2c20
|
@ -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();
|
||||
|
|
15
src/func.rs
15
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<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),
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Reference in New Issue