refactor(tvix/eval): add opcode::StackIdx type for less ambiguity
Change-Id: I9b9de1f681972c205d4d20bc5731d2ce79858edb Reviewed-on: https://cl.tvl.fyi/c/depot/+/6287 Tested-by: BuildkiteCI Reviewed-by: sterni <sternenseemann@systemli.org>
This commit is contained in:
parent
2cdc6192b4
commit
c73e84d957
3 changed files with 14 additions and 9 deletions
|
@ -22,7 +22,7 @@ use std::rc::Rc;
|
|||
|
||||
use crate::chunk::Chunk;
|
||||
use crate::errors::{Error, ErrorKind, EvalResult};
|
||||
use crate::opcode::{CodeIdx, JumpOffset, OpCode};
|
||||
use crate::opcode::{CodeIdx, JumpOffset, OpCode, StackIdx};
|
||||
use crate::value::{Closure, Lambda, Value};
|
||||
use crate::warnings::{EvalWarning, WarningKind};
|
||||
|
||||
|
@ -116,11 +116,11 @@ impl Scope {
|
|||
}
|
||||
|
||||
/// Resolve the stack index of a statically known local.
|
||||
fn resolve_local(&mut self, name: &str) -> Option<usize> {
|
||||
fn resolve_local(&mut self, name: &str) -> Option<StackIdx> {
|
||||
for (idx, local) in self.locals.iter_mut().enumerate().rev() {
|
||||
if !local.phantom && local.name == name {
|
||||
local.used = true;
|
||||
return Some(idx);
|
||||
return Some(StackIdx(idx));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -799,7 +799,7 @@ impl Compiler {
|
|||
self.scope_mut().with_stack.push(With { depth });
|
||||
|
||||
let with_idx = self.scope().locals.len() - 1;
|
||||
self.chunk().push_op(OpCode::OpPushWith(with_idx));
|
||||
self.chunk().push_op(OpCode::OpPushWith(StackIdx(with_idx)));
|
||||
|
||||
self.compile(node.body().unwrap());
|
||||
}
|
||||
|
|
|
@ -11,6 +11,11 @@ pub struct ConstantIdx(pub usize);
|
|||
#[derive(Clone, Copy, Debug)]
|
||||
pub struct CodeIdx(pub usize);
|
||||
|
||||
/// Index of a value in the runtime stack.
|
||||
#[repr(transparent)]
|
||||
#[derive(Clone, Copy, Debug)]
|
||||
pub struct StackIdx(pub usize);
|
||||
|
||||
/// Offset by which an instruction pointer should change in a jump.
|
||||
#[repr(transparent)]
|
||||
#[derive(Clone, Copy, Debug)]
|
||||
|
@ -63,7 +68,7 @@ pub enum OpCode {
|
|||
OpAttrsIsSet,
|
||||
|
||||
// `with`-handling
|
||||
OpPushWith(usize),
|
||||
OpPushWith(StackIdx),
|
||||
OpPopWith,
|
||||
OpResolveWith,
|
||||
|
||||
|
@ -78,7 +83,7 @@ pub enum OpCode {
|
|||
OpAssertBool,
|
||||
|
||||
// Access local identifiers with statically known positions.
|
||||
OpGetLocal(usize),
|
||||
OpGetLocal(StackIdx),
|
||||
|
||||
// Close scopes while leaving their expression value around.
|
||||
OpCloseScope(usize), // number of locals to pop
|
||||
|
|
|
@ -6,7 +6,7 @@ use std::rc::Rc;
|
|||
use crate::{
|
||||
chunk::Chunk,
|
||||
errors::{ErrorKind, EvalResult},
|
||||
opcode::{JumpOffset, OpCode},
|
||||
opcode::{JumpOffset, OpCode, StackIdx},
|
||||
value::{Closure, Lambda, NixAttrs, NixList, Value},
|
||||
};
|
||||
|
||||
|
@ -318,13 +318,13 @@ impl VM {
|
|||
}
|
||||
}
|
||||
|
||||
OpCode::OpGetLocal(local_idx) => {
|
||||
OpCode::OpGetLocal(StackIdx(local_idx)) => {
|
||||
let idx = self.frame().stack_offset + local_idx;
|
||||
let value = self.stack[idx].clone();
|
||||
self.push(value)
|
||||
}
|
||||
|
||||
OpCode::OpPushWith(idx) => self.with_stack.push(idx),
|
||||
OpCode::OpPushWith(StackIdx(idx)) => self.with_stack.push(idx),
|
||||
OpCode::OpPopWith => {
|
||||
self.with_stack.pop();
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue