don't make the user reset Interpreter between invocations

This commit is contained in:
Andrew Dirksen 2018-11-21 17:12:47 -08:00
parent f981e525c8
commit 84331a9325
2 changed files with 6 additions and 22 deletions

View File

@ -37,10 +37,7 @@ fn bench_tiny_keccak(b: &mut Bencher) {
let func = func.as_func().unwrap();
let mut interpreter = Interpreter::new();
b.iter(|| {
interpreter.reset();
interpreter.invoke(&func, &[test_data_ptr], &mut NopExternals).unwrap()
});
b.iter(|| interpreter.invoke(&func, &[test_data_ptr], &mut NopExternals).unwrap());
}
#[bench]
@ -83,10 +80,7 @@ fn bench_rev_comp(b: &mut Bencher) {
let func = func.as_func().unwrap();
let mut interpreter = Interpreter::new();
b.iter(|| {
interpreter.reset();
interpreter.invoke(&func, &[test_data_ptr], &mut NopExternals).unwrap()
});
b.iter(|| interpreter.invoke(&func, &[test_data_ptr], &mut NopExternals).unwrap());
// Verify the result.
let output_data_mem_offset = assert_matches!(
@ -140,10 +134,7 @@ fn bench_regex_redux(b: &mut Bencher) {
let func = func.as_func().unwrap();
let mut interpreter = Interpreter::new();
b.iter(|| {
interpreter.reset();
interpreter.invoke(&func, &[test_data_ptr], &mut NopExternals).unwrap()
});
b.iter(|| interpreter.invoke(&func, &[test_data_ptr], &mut NopExternals).unwrap());
}
#[bench]
@ -173,7 +164,6 @@ fn fac_recursive(b: &mut Bencher) {
let mut interpreter = Interpreter::new();
b.iter(|| {
interpreter.reset();
let value = interpreter
.invoke(&func, &[RuntimeValue::I64(25)], &mut NopExternals)
.unwrap();
@ -213,7 +203,6 @@ fn fac_opt(b: &mut Bencher) {
let mut interpreter = Interpreter::new();
b.iter(|| {
interpreter.reset();
let value = interpreter
.invoke(&func, &[RuntimeValue::I64(25)], &mut NopExternals)
.unwrap();
@ -254,7 +243,6 @@ fn recursive_ok(b: &mut Bencher) {
let mut interpreter = Interpreter::new();
b.iter(|| {
interpreter.reset();
let value = interpreter
.invoke(&func, &[RuntimeValue::I32(8000)], &mut NopExternals)
.unwrap();
@ -294,7 +282,6 @@ fn recursive_trap(b: &mut Bencher) {
let mut interpreter = Interpreter::new();
b.iter(|| {
interpreter.reset();
interpreter
.invoke(&func, &[RuntimeValue::I32(1000)], &mut NopExternals)
.unwrap_err();

View File

@ -209,10 +209,8 @@ impl Interpreter {
}
}
// Todo, use types to prevent user from calling start_execution on an interpreter not in Initialized
// state.
/// Wipe all data in this interpreter, so it can be safely reused.
pub fn reset(&mut self) {
/// Wipe all data in this interpreter so it can be safely reused.
fn reset(&mut self) {
self.value_stack.truncate(0);
self.call_stack.truncate(0);
self.state = InterpreterState::Initialized;
@ -252,8 +250,7 @@ impl Interpreter {
args: &[RuntimeValue],
externals: &mut E,
) -> Result<Option<RuntimeValue>, Trap> {
// Ensure that the VM has not been executed. This is checked in `FuncInvocation::start_execution`.
assert!(self.state == InterpreterState::Initialized);
self.reset();
// Add initial args to value stack
for arg in args {