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 <tazjin@tvl.su>
Autosubmit: tazjin <tazjin@tvl.su>
This commit is contained in:
Vincent Ambo 2022-09-18 20:18:25 +03:00 committed by tazjin
parent d42d8f3089
commit bcbe1603c8
3 changed files with 10 additions and 2 deletions

View file

@ -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));

View file

@ -0,0 +1 @@
42

View file

@ -0,0 +1,5 @@
({
x = {
y = 42;
};
}).x.y