Add an assert that stack is empty after the exec
This commit is contained in:
parent
856a34ca25
commit
b7fff03264
|
@ -77,12 +77,14 @@ impl<'a, E: Externals> Interpreter<'a, E> {
|
||||||
|
|
||||||
self.run_interpreter_loop(&mut call_stack)?;
|
self.run_interpreter_loop(&mut call_stack)?;
|
||||||
|
|
||||||
Ok(func.signature().return_type().map(|_vt| {
|
let opt_return_value = func.signature().return_type().map(|_vt| {
|
||||||
let return_value = self.value_stack
|
self.value_stack.pop()
|
||||||
.pop();
|
});
|
||||||
|
|
||||||
return_value
|
// Ensure that stack is empty after the execution.
|
||||||
}))
|
assert!(self.value_stack.len() == 0);
|
||||||
|
|
||||||
|
Ok(opt_return_value)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn run_interpreter_loop(&mut self, call_stack: &mut Vec<FunctionContext>) -> Result<(), Trap> {
|
fn run_interpreter_loop(&mut self, call_stack: &mut Vec<FunctionContext>) -> Result<(), Trap> {
|
||||||
|
@ -132,7 +134,7 @@ impl<'a, E: Externals> Interpreter<'a, E> {
|
||||||
let return_val = FuncInstance::invoke(&nested_func, &args, self.externals)?;
|
let return_val = FuncInstance::invoke(&nested_func, &args, self.externals)?;
|
||||||
|
|
||||||
// Check if `return_val` matches the signature.
|
// Check if `return_val` matches the signature.
|
||||||
let value_ty = return_val.clone().map(|val| val.value_type());
|
let value_ty = return_val.as_ref().map(|val| val.value_type());
|
||||||
let expected_ty = nested_func.signature().return_type();
|
let expected_ty = nested_func.signature().return_type();
|
||||||
if value_ty != expected_ty {
|
if value_ty != expected_ty {
|
||||||
return Err(TrapKind::UnexpectedSignature.into());
|
return Err(TrapKind::UnexpectedSignature.into());
|
||||||
|
|
Loading…
Reference in New Issue