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