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
 |         // Push the set onto the stack
 | ||||||
|         self.compile(slot, set.clone()); |         self.compile(slot, set.clone()); | ||||||
|         self.emit_force(&set); |  | ||||||
| 
 | 
 | ||||||
|         // Compile each key fragment and emit access instructions.
 |         // Compile each key fragment and emit access instructions.
 | ||||||
|         //
 |         //
 | ||||||
|         // TODO: multi-select instruction to avoid re-pushing attrs on
 |         // TODO: multi-select instruction to avoid re-pushing attrs on
 | ||||||
|         // nested selects.
 |         // nested selects.
 | ||||||
|         for fragment in path.attrs() { |         for fragment in path.attrs() { | ||||||
|  |             // Force the current set value.
 | ||||||
|  |             self.emit_force(&fragment); | ||||||
|  | 
 | ||||||
|             self.compile_attr(slot, fragment.clone()); |             self.compile_attr(slot, fragment.clone()); | ||||||
|             self.push_op(OpCode::OpAttrsSelect, &fragment); |             self.push_op(OpCode::OpAttrsSelect, &fragment); | ||||||
|         } |         } | ||||||
|  | @ -319,10 +321,10 @@ impl Compiler<'_> { | ||||||
|         default: ast::Expr, |         default: ast::Expr, | ||||||
|     ) { |     ) { | ||||||
|         self.compile(slot, set.clone()); |         self.compile(slot, set.clone()); | ||||||
|         self.emit_force(&set); |  | ||||||
|         let mut jumps = vec![]; |         let mut jumps = vec![]; | ||||||
| 
 | 
 | ||||||
|         for fragment in path.attrs() { |         for fragment in path.attrs() { | ||||||
|  |             self.emit_force(&fragment); | ||||||
|             self.compile_attr(slot, fragment.clone()); |             self.compile_attr(slot, fragment.clone()); | ||||||
|             self.push_op(OpCode::OpAttrsTrySelect, &fragment); |             self.push_op(OpCode::OpAttrsTrySelect, &fragment); | ||||||
|             jumps.push(self.push_op(OpCode::OpJumpIfNotFound(JumpOffset(0)), &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…
	
	Add table
		Add a link
		
	
		Reference in a new issue