cf3e3b784b
This makes it possible to check things like `{} ? a` with a single level of nesting. Change-Id: I567c36fcfd2f9e2f60071acd3ebfe56dea59b26f Reviewed-on: https://cl.tvl.fyi/c/depot/+/6161 Tested-by: BuildkiteCI Reviewed-by: grfn <grfn@gws.fyi> Reviewed-by: sterni <sternenseemann@systemli.org>
61 lines
1 KiB
Rust
61 lines
1 KiB
Rust
//! This module implements the instruction set running on the abstract
|
|
//! machine implemented by tvix.
|
|
|
|
#[derive(Clone, Copy, Debug)]
|
|
pub struct ConstantIdx(pub usize);
|
|
|
|
#[derive(Clone, Copy, Debug)]
|
|
pub struct CodeIdx(pub usize);
|
|
|
|
#[derive(Clone, Copy, Debug)]
|
|
pub enum OpCode {
|
|
// Push a constant onto the stack.
|
|
OpConstant(ConstantIdx),
|
|
|
|
// Discard a value from the stack.
|
|
OpPop,
|
|
|
|
// Push a literal value.
|
|
OpNull,
|
|
OpTrue,
|
|
OpFalse,
|
|
|
|
// Unary operators
|
|
OpInvert,
|
|
OpNegate,
|
|
|
|
// Arithmetic binary operators
|
|
OpAdd,
|
|
OpSub,
|
|
OpMul,
|
|
OpDiv,
|
|
|
|
// Comparison operators
|
|
OpEqual,
|
|
OpLess,
|
|
OpLessOrEq,
|
|
OpMore,
|
|
OpMoreOrEq,
|
|
|
|
// Logical operators & generic jumps
|
|
OpJump(usize),
|
|
OpJumpIfTrue(usize),
|
|
OpJumpIfFalse(usize),
|
|
|
|
// Attribute sets
|
|
OpAttrs(usize),
|
|
OpAttrPath(usize),
|
|
OpAttrsUpdate,
|
|
OpAttrsSelect,
|
|
OpAttrsIsSet,
|
|
|
|
// Lists
|
|
OpList(usize),
|
|
OpConcat,
|
|
|
|
// Strings
|
|
OpInterpolate(usize),
|
|
|
|
// Type assertion operators
|
|
OpAssertBool,
|
|
}
|