From bcbe1603c8d50b69705fb737961b6a4827a50591 Mon Sep 17 00:00:00 2001 From: Vincent Ambo Date: Sun, 18 Sep 2022 20:18:25 +0300 Subject: fix(tvix/eval): ensure all thunks are forced in nested selects 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 Autosubmit: tazjin --- tvix/eval/src/compiler/attrs.rs | 6 ++++-- tvix/eval/src/tests/tvix_tests/eval-okay-nested-set-thunks.exp | 1 + tvix/eval/src/tests/tvix_tests/eval-okay-nested-set-thunks.nix | 5 +++++ 3 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 tvix/eval/src/tests/tvix_tests/eval-okay-nested-set-thunks.exp create mode 100644 tvix/eval/src/tests/tvix_tests/eval-okay-nested-set-thunks.nix (limited to 'tvix') diff --git a/tvix/eval/src/compiler/attrs.rs b/tvix/eval/src/compiler/attrs.rs index 1584d5017a..5dee3a905d 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 0000000000..d81cc0710e --- /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 0000000000..f3ad829354 --- /dev/null +++ b/tvix/eval/src/tests/tvix_tests/eval-okay-nested-set-thunks.nix @@ -0,0 +1,5 @@ +({ + x = { + y = 42; + }; +}).x.y -- cgit 1.4.1