From 7506983ce2748fadef56aa390e61003dbf556a98 Mon Sep 17 00:00:00 2001 From: sterni Date: Mon, 19 Sep 2022 13:09:03 +0200 Subject: [PATCH] fix(tvix/eval): force condition of an assert Change-Id: I3ad2234e8a8e4280e498c6d7af8ea0733ed4c7ea Reviewed-on: https://cl.tvl.fyi/c/depot/+/6699 Autosubmit: sterni Reviewed-by: tazjin Tested-by: BuildkiteCI --- tvix/eval/src/compiler/mod.rs | 1 + .../tests/tvix_tests/eval-okay-assert-thunk-condition.exp | 1 + .../tests/tvix_tests/eval-okay-assert-thunk-condition.nix | 7 +++++++ 3 files changed, 9 insertions(+) create mode 100644 tvix/eval/src/tests/tvix_tests/eval-okay-assert-thunk-condition.exp create mode 100644 tvix/eval/src/tests/tvix_tests/eval-okay-assert-thunk-condition.nix diff --git a/tvix/eval/src/compiler/mod.rs b/tvix/eval/src/compiler/mod.rs index 160433904..793f0566e 100644 --- a/tvix/eval/src/compiler/mod.rs +++ b/tvix/eval/src/compiler/mod.rs @@ -471,6 +471,7 @@ impl Compiler<'_> { fn compile_assert(&mut self, slot: LocalIdx, node: ast::Assert) { // Compile the assertion condition to leave its value on the stack. self.compile(slot, node.condition().unwrap()); + self.emit_force(&node.condition().unwrap()); self.push_op(OpCode::OpAssert, &node.condition().unwrap()); // The runtime will abort evaluation at this point if the diff --git a/tvix/eval/src/tests/tvix_tests/eval-okay-assert-thunk-condition.exp b/tvix/eval/src/tests/tvix_tests/eval-okay-assert-thunk-condition.exp new file mode 100644 index 000000000..aabe6ec39 --- /dev/null +++ b/tvix/eval/src/tests/tvix_tests/eval-okay-assert-thunk-condition.exp @@ -0,0 +1 @@ +21 diff --git a/tvix/eval/src/tests/tvix_tests/eval-okay-assert-thunk-condition.nix b/tvix/eval/src/tests/tvix_tests/eval-okay-assert-thunk-condition.nix new file mode 100644 index 000000000..8934b3d8c --- /dev/null +++ b/tvix/eval/src/tests/tvix_tests/eval-okay-assert-thunk-condition.nix @@ -0,0 +1,7 @@ +let + condition = x: y: x < y; +in + +# The function application here will become a thunk which verifies that +# assert forces the condition expression correctly. +assert condition 21 42; 21