about summary refs log tree commit diff
diff options
context:
space:
mode:
authorVincent Ambo <mail@tazj.in>2022-09-18T17·18+0300
committertazjin <tazjin@tvl.su>2022-09-18T22·16+0000
commitbcbe1603c8d50b69705fb737961b6a4827a50591 (patch)
treeeeb5ceb378e8a3d2a6032ac2ac0476ab8f670281
parentd42d8f3089c524cfa9e2fc332a81af5c0686db8d (diff)
fix(tvix/eval): ensure all thunks are forced in nested selects r/4913
Previously only the first one was guaranteed to be forced, but we need
to do this for all of them.

Fixes b/190

Change-Id: I76b5667dbfb2f3fde3587e7b91d268cbf32aca00
Reviewed-on: https://cl.tvl.fyi/c/depot/+/6645
Tested-by: BuildkiteCI
Reviewed-by: tazjin <tazjin@tvl.su>
Autosubmit: tazjin <tazjin@tvl.su>
-rw-r--r--tvix/eval/src/compiler/attrs.rs6
-rw-r--r--tvix/eval/src/tests/tvix_tests/eval-okay-nested-set-thunks.exp1
-rw-r--r--tvix/eval/src/tests/tvix_tests/eval-okay-nested-set-thunks.nix5
3 files changed, 10 insertions, 2 deletions
diff --git a/tvix/eval/src/compiler/attrs.rs b/tvix/eval/src/compiler/attrs.rs
index 1584d5017aa2..5dee3a905d01 100644
--- a/tvix/eval/src/compiler/attrs.rs
+++ b/tvix/eval/src/compiler/attrs.rs
@@ -270,13 +270,15 @@ impl Compiler<'_> {
 
         // Push the set onto the stack
         self.compile(slot, set.clone());
-        self.emit_force(&set);
 
         // Compile each key fragment and emit access instructions.
         //
         // TODO: multi-select instruction to avoid re-pushing attrs on
         // nested selects.
         for fragment in path.attrs() {
+            // Force the current set value.
+            self.emit_force(&fragment);
+
             self.compile_attr(slot, fragment.clone());
             self.push_op(OpCode::OpAttrsSelect, &fragment);
         }
@@ -319,10 +321,10 @@ impl Compiler<'_> {
         default: ast::Expr,
     ) {
         self.compile(slot, set.clone());
-        self.emit_force(&set);
         let mut jumps = vec![];
 
         for fragment in path.attrs() {
+            self.emit_force(&fragment);
             self.compile_attr(slot, fragment.clone());
             self.push_op(OpCode::OpAttrsTrySelect, &fragment);
             jumps.push(self.push_op(OpCode::OpJumpIfNotFound(JumpOffset(0)), &fragment));
diff --git a/tvix/eval/src/tests/tvix_tests/eval-okay-nested-set-thunks.exp b/tvix/eval/src/tests/tvix_tests/eval-okay-nested-set-thunks.exp
new file mode 100644
index 000000000000..d81cc0710eb6
--- /dev/null
+++ b/tvix/eval/src/tests/tvix_tests/eval-okay-nested-set-thunks.exp
@@ -0,0 +1 @@
+42
diff --git a/tvix/eval/src/tests/tvix_tests/eval-okay-nested-set-thunks.nix b/tvix/eval/src/tests/tvix_tests/eval-okay-nested-set-thunks.nix
new file mode 100644
index 000000000000..f3ad8293540f
--- /dev/null
+++ b/tvix/eval/src/tests/tvix_tests/eval-okay-nested-set-thunks.nix
@@ -0,0 +1,5 @@
+({
+  x = {
+    y = 42;
+  };
+}).x.y