docs(tvix/eval) comments for various fields

Change-Id: I8dcddf2b419761e475e71215c199eef2f7dc61dc
Reviewed-on: https://cl.tvl.fyi/c/depot/+/7028
Autosubmit: Adam Joseph <adam@westernsemico.com>
Tested-by: BuildkiteCI
Reviewed-by: tazjin <tazjin@tvl.su>
This commit is contained in:
Adam Joseph 2022-10-15 17:06:08 -07:00 committed by clbot
parent f05a1d27d9
commit 6e30fbbf7b
3 changed files with 27 additions and 5 deletions

View file

@ -48,6 +48,8 @@ pub struct JumpOffset(pub usize);
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct Count(pub usize);
/// All variants of this enum carry a bounded amount of data to
/// ensure that no heap allocations are needed for an Opcode.
#[warn(variant_size_differences)]
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum OpCode {
@ -146,12 +148,17 @@ pub enum OpCode {
/// given stack index after the scope is fully bound.
OpFinalise(StackIdx),
// The closure and thunk creation instructions have a variable
// number of arguments to the instruction, which is represented
// here by making their data part of the opcodes.
// [`OpClosure`] and [`OpThunk`] have a variable number of
// arguments to the instruction, which is represented here by
// making their data part of the opcodes. Each of these two
// opcodes has a `ConstantIdx`, which must reference a
// `Value::Blueprint(Lambda)`. The `upvalue_count` field in
// that `Lambda` indicates the number of arguments it takes, and
// the `OpClosure` or `OpThunk` must be followed by exactly this
// number of `Data*` opcodes. The VM skips over these by
// advancing the instruction pointer.
//
// The VM skips over these by advancing the instruction pointer
// according to the count.
// It is illegal for a `Data*` opcode to appear anywhere else.
DataLocalIdx(StackIdx),
DataDeferredLocal(StackIdx),
DataUpvalueIdx(UpvalueIdx),

View file

@ -9,10 +9,20 @@ use crate::{
upvalues::{UpvalueCarrier, Upvalues},
};
/// The opcodes for a thunk or closure, plus the number of
/// non-executable opcodes which are allowed after an OpClosure or
/// OpThunk referencing it. At runtime `Lambda` is usually wrapped
/// in `Rc` to avoid copying the `Chunk` it holds (which can be
/// quite large).
#[derive(Debug, PartialEq)]
pub struct Lambda {
// name: Option<NixString>,
pub(crate) chunk: Chunk,
/// Number of upvalues which the code in this Lambda closes
/// over, and which need to be initialised at
/// runtime. Information about the variables is emitted using
/// data-carrying opcodes (see [`OpCode::DataLocalIdx`]).
pub(crate) upvalue_count: usize,
}

View file

@ -43,8 +43,13 @@ pub enum Value {
// Internal values that, while they technically exist at runtime,
// are never returned to or created directly by users.
Thunk(Thunk),
// See [`compiler::compile_select_or()`] for explanation
AttrNotFound,
// this can only occur in Chunk::Constants and nowhere else
Blueprint(Rc<Lambda>),
DeferredUpvalue(StackIdx),
UnresolvedPath(PathBuf),
}