refactor(tvix/eval): add opcode::Count type for less ambiguity
Change-Id: Ibde0b2baa1128a74c1364ee9a6330b62db3da699 Reviewed-on: https://cl.tvl.fyi/c/depot/+/6288 Autosubmit: tazjin <tazjin@tvl.su> Tested-by: BuildkiteCI Reviewed-by: sterni <sternenseemann@systemli.org>
This commit is contained in:
parent
c73e84d957
commit
2f93ed297e
3 changed files with 23 additions and 17 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, StackIdx};
|
||||
use crate::opcode::{CodeIdx, Count, JumpOffset, OpCode, StackIdx};
|
||||
use crate::value::{Closure, Lambda, Value};
|
||||
use crate::warnings::{EvalWarning, WarningKind};
|
||||
|
||||
|
@ -298,7 +298,7 @@ impl Compiler {
|
|||
}
|
||||
|
||||
if count != 1 {
|
||||
self.chunk().push_op(OpCode::OpInterpolate(count));
|
||||
self.chunk().push_op(OpCode::OpInterpolate(Count(count)));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -462,7 +462,7 @@ impl Compiler {
|
|||
self.compile(item);
|
||||
}
|
||||
|
||||
self.chunk().push_op(OpCode::OpList(count));
|
||||
self.chunk().push_op(OpCode::OpList(Count(count)));
|
||||
}
|
||||
|
||||
// Compile attribute set literals into equivalent bytecode.
|
||||
|
@ -547,7 +547,7 @@ impl Compiler {
|
|||
// otherwise we need to emit an instruction to construct
|
||||
// the attribute path.
|
||||
if key_count > 1 {
|
||||
self.chunk().push_op(OpCode::OpAttrPath(key_count));
|
||||
self.chunk().push_op(OpCode::OpAttrPath(Count(key_count)));
|
||||
}
|
||||
|
||||
// The value is just compiled as normal so that its
|
||||
|
@ -556,7 +556,7 @@ impl Compiler {
|
|||
self.compile(kv.value().unwrap());
|
||||
}
|
||||
|
||||
self.chunk().push_op(OpCode::OpAttrs(count));
|
||||
self.chunk().push_op(OpCode::OpAttrs(Count(count)));
|
||||
}
|
||||
|
||||
fn compile_select(&mut self, node: ast::Select) {
|
||||
|
@ -925,7 +925,7 @@ impl Compiler {
|
|||
}
|
||||
|
||||
if pops > 0 {
|
||||
self.chunk().push_op(OpCode::OpCloseScope(pops));
|
||||
self.chunk().push_op(OpCode::OpCloseScope(Count(pops)));
|
||||
}
|
||||
|
||||
while !self.scope().with_stack.is_empty()
|
||||
|
|
|
@ -21,6 +21,12 @@ pub struct StackIdx(pub usize);
|
|||
#[derive(Clone, Copy, Debug)]
|
||||
pub struct JumpOffset(pub usize);
|
||||
|
||||
/// Provided count for an instruction (could represent e.g. a number
|
||||
/// of elements).
|
||||
#[repr(transparent)]
|
||||
#[derive(Clone, Copy, Debug)]
|
||||
pub struct Count(pub usize);
|
||||
|
||||
#[allow(clippy::enum_variant_names)]
|
||||
#[warn(variant_size_differences)]
|
||||
#[derive(Clone, Copy, Debug)]
|
||||
|
@ -60,8 +66,8 @@ pub enum OpCode {
|
|||
OpJumpIfNotFound(JumpOffset),
|
||||
|
||||
// Attribute sets
|
||||
OpAttrs(usize),
|
||||
OpAttrPath(usize),
|
||||
OpAttrs(Count),
|
||||
OpAttrPath(Count),
|
||||
OpAttrsUpdate,
|
||||
OpAttrsSelect,
|
||||
OpAttrsTrySelect,
|
||||
|
@ -73,11 +79,11 @@ pub enum OpCode {
|
|||
OpResolveWith,
|
||||
|
||||
// Lists
|
||||
OpList(usize),
|
||||
OpList(Count),
|
||||
OpConcat,
|
||||
|
||||
// Strings
|
||||
OpInterpolate(usize),
|
||||
OpInterpolate(Count),
|
||||
|
||||
// Type assertion operators
|
||||
OpAssertBool,
|
||||
|
@ -86,7 +92,7 @@ pub enum OpCode {
|
|||
OpGetLocal(StackIdx),
|
||||
|
||||
// Close scopes while leaving their expression value around.
|
||||
OpCloseScope(usize), // number of locals to pop
|
||||
OpCloseScope(Count), // number of locals to pop
|
||||
|
||||
// Asserts stack top is a boolean, and true.
|
||||
OpAssert,
|
||||
|
|
|
@ -6,7 +6,7 @@ use std::rc::Rc;
|
|||
use crate::{
|
||||
chunk::Chunk,
|
||||
errors::{ErrorKind, EvalResult},
|
||||
opcode::{JumpOffset, OpCode, StackIdx},
|
||||
opcode::{Count, JumpOffset, OpCode, StackIdx},
|
||||
value::{Closure, Lambda, NixAttrs, NixList, Value},
|
||||
};
|
||||
|
||||
|
@ -199,8 +199,8 @@ impl VM {
|
|||
OpCode::OpTrue => self.push(Value::Bool(true)),
|
||||
OpCode::OpFalse => self.push(Value::Bool(false)),
|
||||
|
||||
OpCode::OpAttrs(count) => self.run_attrset(count)?,
|
||||
OpCode::OpAttrPath(count) => self.run_attr_path(count)?,
|
||||
OpCode::OpAttrs(Count(count)) => self.run_attrset(count)?,
|
||||
OpCode::OpAttrPath(Count(count)) => self.run_attr_path(count)?,
|
||||
|
||||
OpCode::OpAttrsUpdate => {
|
||||
let rhs = unwrap_or_clone_rc(self.pop().to_attrs()?);
|
||||
|
@ -252,7 +252,7 @@ impl VM {
|
|||
self.push(Value::Bool(result));
|
||||
}
|
||||
|
||||
OpCode::OpList(count) => {
|
||||
OpCode::OpList(Count(count)) => {
|
||||
let list =
|
||||
NixList::construct(count, self.stack.split_off(self.stack.len() - count));
|
||||
self.push(Value::List(list));
|
||||
|
@ -264,7 +264,7 @@ impl VM {
|
|||
self.push(Value::List(lhs.concat(&rhs)))
|
||||
}
|
||||
|
||||
OpCode::OpInterpolate(count) => self.run_interpolate(count)?,
|
||||
OpCode::OpInterpolate(Count(count)) => self.run_interpolate(count)?,
|
||||
|
||||
OpCode::OpJump(JumpOffset(offset)) => {
|
||||
self.frame_mut().ip += offset;
|
||||
|
@ -306,7 +306,7 @@ impl VM {
|
|||
|
||||
// Remove the given number of elements from the stack,
|
||||
// but retain the top value.
|
||||
OpCode::OpCloseScope(count) => {
|
||||
OpCode::OpCloseScope(Count(count)) => {
|
||||
// Immediately move the top value into the right
|
||||
// position.
|
||||
let target_idx = self.stack.len() - 1 - count;
|
||||
|
|
Loading…
Reference in a new issue