This is required for constructing nested attribute sets at runtime. There'll be quite a lot of optimisation potential with this solution eventually, if it should turn out to be a bottleneck. This introduces a conceptual change, in that the `Value` enum is now an enum representing "all runtime values" instead of "all Nix language types". This makes sense in general, as this type will also contain Chunk representations etc. which are not exposed to users. Change-Id: Ic5f72b2a0965b146c6a451efad34c6a81ca1aad8 Reviewed-on: https://cl.tvl.fyi/c/depot/+/6103 Reviewed-by: grfn <grfn@gws.fyi> Tested-by: BuildkiteCI
42 lines
737 B
Rust
42 lines
737 B
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),
|
|
|
|
// Push a literal value.
|
|
OpNull,
|
|
OpTrue,
|
|
OpFalse,
|
|
|
|
// Unary operators
|
|
OpInvert,
|
|
OpNegate,
|
|
|
|
// Arithmetic binary operators
|
|
OpAdd,
|
|
OpSub,
|
|
OpMul,
|
|
OpDiv,
|
|
|
|
// Logical binary operators
|
|
OpEqual,
|
|
|
|
// Attribute sets
|
|
OpAttrs(usize),
|
|
OpAttrPath(usize),
|
|
|
|
// Lists
|
|
OpList(usize),
|
|
|
|
// Strings
|
|
OpInterpolate(usize),
|
|
}
|