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:
parent
d42d8f3089
commit
bcbe1603c8
3 changed files with 10 additions and 2 deletions
|
@ -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));
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
42
|
|
@ -0,0 +1,5 @@
|
|||
({
|
||||
x = {
|
||||
y = 42;
|
||||
};
|
||||
}).x.y
|
Loading…
Reference in a new issue