refactor(tvix/eval): use CodeIdx wrapper for instruction pointer
As suggested by sterni in cl/6453. Change-Id: I3cf80d97c11fd7d085ab510f6be4b5f937c791ec Reviewed-on: https://cl.tvl.fyi/c/depot/+/6562 Reviewed-by: sterni <sternenseemann@systemli.org> Tested-by: BuildkiteCI
This commit is contained in:
parent
a9914a79a0
commit
d5ee893fb1
3 changed files with 34 additions and 9 deletions
|
@ -53,7 +53,7 @@ pub trait Observer {
|
|||
|
||||
/// Called when the runtime *begins* executing an instruction. The
|
||||
/// provided stack is the state at the beginning of the operation.
|
||||
fn observe_execute_op(&mut self, _ip: usize, _: &OpCode, _: &[Value]) {}
|
||||
fn observe_execute_op(&mut self, _ip: CodeIdx, _: &OpCode, _: &[Value]) {}
|
||||
}
|
||||
|
||||
#[derive(Default)]
|
||||
|
@ -162,8 +162,8 @@ impl<W: Write> Observer for TracingObserver<W> {
|
|||
);
|
||||
}
|
||||
|
||||
fn observe_execute_op(&mut self, ip: usize, op: &OpCode, stack: &[Value]) {
|
||||
let _ = write!(&mut self.writer, "{:04} {:?}\t[ ", ip, op);
|
||||
fn observe_execute_op(&mut self, ip: CodeIdx, op: &OpCode, stack: &[Value]) {
|
||||
let _ = write!(&mut self.writer, "{:04} {:?}\t[ ", ip.0, op);
|
||||
|
||||
for val in stack {
|
||||
let _ = write!(&mut self.writer, "{} ", val);
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
//! This module implements the instruction set running on the abstract
|
||||
//! machine implemented by tvix.
|
||||
|
||||
use std::ops::{AddAssign, Sub};
|
||||
|
||||
/// Index of a constant in the current code chunk.
|
||||
#[repr(transparent)]
|
||||
#[derive(Clone, Copy, Debug)]
|
||||
|
@ -11,6 +13,20 @@ pub struct ConstantIdx(pub usize);
|
|||
#[derive(Clone, Copy, Debug)]
|
||||
pub struct CodeIdx(pub usize);
|
||||
|
||||
impl AddAssign<usize> for CodeIdx {
|
||||
fn add_assign(&mut self, rhs: usize) {
|
||||
*self = CodeIdx(self.0 + rhs)
|
||||
}
|
||||
}
|
||||
|
||||
impl Sub<usize> for CodeIdx {
|
||||
type Output = Self;
|
||||
|
||||
fn sub(self, rhs: usize) -> Self::Output {
|
||||
CodeIdx(self.0 - rhs)
|
||||
}
|
||||
}
|
||||
|
||||
/// Index of a value in the runtime stack.
|
||||
#[repr(transparent)]
|
||||
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd)]
|
||||
|
|
|
@ -13,9 +13,18 @@ use crate::{
|
|||
};
|
||||
|
||||
struct CallFrame {
|
||||
/// The lambda currently being executed.
|
||||
lambda: Rc<Lambda>,
|
||||
|
||||
/// Optional captured upvalues of this frame (if a thunk or
|
||||
/// closure if being evaluated).
|
||||
upvalues: Upvalues,
|
||||
ip: usize,
|
||||
|
||||
/// Instruction pointer to the instruction currently being
|
||||
/// executed.
|
||||
ip: CodeIdx,
|
||||
|
||||
/// Stack offset, i.e. the frames "view" into the VM's full stack.
|
||||
stack_offset: usize,
|
||||
}
|
||||
|
||||
|
@ -134,7 +143,7 @@ impl<'o> VM<'o> {
|
|||
}
|
||||
|
||||
fn inc_ip(&mut self) -> OpCode {
|
||||
let op = self.chunk().code[self.frame().ip];
|
||||
let op = self.chunk()[self.frame().ip];
|
||||
self.frame_mut().ip += 1;
|
||||
op
|
||||
}
|
||||
|
@ -154,7 +163,7 @@ impl<'o> VM<'o> {
|
|||
/// Returns the source span of the instruction currently being
|
||||
/// executed.
|
||||
fn current_span(&self) -> codemap::Span {
|
||||
self.chunk().get_span(CodeIdx(self.frame().ip - 1))
|
||||
self.chunk().get_span(self.frame().ip - 1)
|
||||
}
|
||||
|
||||
/// Construct an error from the given ErrorKind and the source
|
||||
|
@ -181,7 +190,7 @@ impl<'o> VM<'o> {
|
|||
let frame = CallFrame {
|
||||
lambda,
|
||||
upvalues,
|
||||
ip: 0,
|
||||
ip: CodeIdx(0),
|
||||
stack_offset: self.stack.len() - arg_count,
|
||||
};
|
||||
|
||||
|
@ -200,7 +209,7 @@ impl<'o> VM<'o> {
|
|||
// Break the loop if this call frame has already run to
|
||||
// completion, pop it off, and return the value to the
|
||||
// caller.
|
||||
if self.frame().ip == self.chunk().code.len() {
|
||||
if self.frame().ip.0 == self.chunk().code.len() {
|
||||
self.frames.pop();
|
||||
return Ok(self.pop());
|
||||
}
|
||||
|
@ -465,7 +474,7 @@ impl<'o> VM<'o> {
|
|||
let mut frame = self.frame_mut();
|
||||
frame.lambda = lambda;
|
||||
frame.upvalues = closure.upvalues().clone();
|
||||
frame.ip = 0; // reset instruction pointer to beginning
|
||||
frame.ip = CodeIdx(0); // reset instruction pointer to beginning
|
||||
}
|
||||
|
||||
_ => return Err(self.error(ErrorKind::NotCallable)),
|
||||
|
|
Loading…
Reference in a new issue