fix(tvix/eval): add stack depth assertion to OpReturn
I'm still trying to work out the exact stack invariants for tvix. We really should add assertions for them; getting the stack messed up is no fun. This commit adds one simple assertion. It also adds a missing stack-push (my mistake) in one place, which was uncovered by the assertion. Change-Id: I9d8b4bd1702d954e325832c5935b0d7e3eb68422 Reviewed-on: https://cl.tvl.fyi/c/depot/+/10369 Reviewed-by: tazjin <tazjin@tvl.su> Tested-by: BuildkiteCI
This commit is contained in:
parent
8a52c7f1c5
commit
0c22454bb9
1 changed files with 7 additions and 0 deletions
|
@ -486,6 +486,9 @@ impl<'o> VM<'o> {
|
||||||
|
|
||||||
// Discard the current frame.
|
// Discard the current frame.
|
||||||
OpCode::OpReturn => {
|
OpCode::OpReturn => {
|
||||||
|
// TODO(amjoseph): I think this should assert `==` rather
|
||||||
|
// than `<=` but it fails with the stricter condition.
|
||||||
|
debug_assert!(self.stack.len() - 1 <= frame.stack_offset);
|
||||||
return Ok(true);
|
return Ok(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1081,6 +1084,10 @@ impl<'o> VM<'o> {
|
||||||
}
|
}
|
||||||
|
|
||||||
val @ Value::Catchable(_) => {
|
val @ Value::Catchable(_) => {
|
||||||
|
// the argument that we tried to apply a catchable to
|
||||||
|
self.stack.pop();
|
||||||
|
// applying a `throw` to anything is still a `throw`, so we just
|
||||||
|
// push it back on the stack.
|
||||||
self.stack.push(val);
|
self.stack.push(val);
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue