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…
Reference in a new issue