refactor(tvix/eval): store Closure inside of the VM's call frames
In preparation for implementing calling of closures, store a closure directly in the VMs call frame. Change-Id: Iad24cd8c49fee4ebd4d0c84ffaa4c2505ee3dfd6 Reviewed-on: https://cl.tvl.fyi/c/depot/+/6293 Tested-by: BuildkiteCI Reviewed-by: grfn <grfn@gws.fyi>
This commit is contained in:
		
							parent
							
								
									5ecf573dff
								
							
						
					
					
						commit
						3d8888a13e
					
				
					 1 changed files with 6 additions and 6 deletions
				
			
		|  | @ -14,7 +14,7 @@ use crate::{ | ||||||
| use crate::disassembler::Tracer; | use crate::disassembler::Tracer; | ||||||
| 
 | 
 | ||||||
| struct CallFrame { | struct CallFrame { | ||||||
|     lambda: Lambda, |     closure: Closure, | ||||||
|     ip: usize, |     ip: usize, | ||||||
|     stack_offset: usize, |     stack_offset: usize, | ||||||
| } | } | ||||||
|  | @ -86,7 +86,7 @@ impl VM { | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     fn chunk(&self) -> &Chunk { |     fn chunk(&self) -> &Chunk { | ||||||
|         &self.frame().lambda.chunk |         &self.frame().closure.lambda.chunk | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     fn frame_mut(&mut self) -> &mut CallFrame { |     fn frame_mut(&mut self) -> &mut CallFrame { | ||||||
|  | @ -112,9 +112,9 @@ impl VM { | ||||||
|         &self.stack[self.stack.len() - 1 - offset] |         &self.stack[self.stack.len() - 1 - offset] | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     fn call(&mut self, lambda: Lambda, arg_count: usize) { |     fn call(&mut self, closure: Closure, arg_count: usize) { | ||||||
|         let frame = CallFrame { |         let frame = CallFrame { | ||||||
|             lambda, |             closure, | ||||||
|             ip: 0, |             ip: 0, | ||||||
|             stack_offset: self.stack.len() - arg_count, |             stack_offset: self.stack.len() - arg_count, | ||||||
|         }; |         }; | ||||||
|  | @ -357,7 +357,7 @@ impl VM { | ||||||
|                 OpCode::OpCall => { |                 OpCode::OpCall => { | ||||||
|                     let callable = self.pop(); |                     let callable = self.pop(); | ||||||
|                     match callable { |                     match callable { | ||||||
|                         Value::Closure(Closure { lambda, .. }) => self.call(lambda, 1), |                         Value::Closure(closure) => self.call(closure, 1), | ||||||
|                         Value::Builtin(builtin) => { |                         Value::Builtin(builtin) => { | ||||||
|                             let arg = self.pop(); |                             let arg = self.pop(); | ||||||
|                             let result = builtin.apply(arg)?; |                             let result = builtin.apply(arg)?; | ||||||
|  | @ -436,6 +436,6 @@ pub fn run_lambda(lambda: Lambda) -> EvalResult<Value> { | ||||||
|         with_stack: vec![], |         with_stack: vec![], | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|     vm.call(lambda, 0); |     vm.call(Closure::new(lambda), 0); | ||||||
|     vm.run() |     vm.run() | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue