feat(tvix/eval): implement (compilation) observer trait

This trait will enable library users of tvix-eval to observe internal
happenings of the compilation and runtime processes.

The initial methods of the observer will be called whenever the
compiler emits a chunk.

Change-Id: I668f6c2cfe3d6f4c1a1612c0f293831011768437
Reviewed-on: https://cl.tvl.fyi/c/depot/+/6448
Reviewed-by: sterni <sternenseemann@systemli.org>
Tested-by: BuildkiteCI
This commit is contained in:
Vincent Ambo 2022-09-04 16:51:33 +03:00 committed by tazjin
parent 1fe6cfe5a2
commit 7ae45342df
2 changed files with 37 additions and 0 deletions

View file

@ -3,6 +3,7 @@ mod chunk;
mod compiler; mod compiler;
mod errors; mod errors;
mod eval; mod eval;
mod observer;
mod opcode; mod opcode;
mod upvalues; mod upvalues;
mod value; mod value;

36
tvix/eval/src/observer.rs Normal file
View file

@ -0,0 +1,36 @@
//! Implements a trait for things that wish to observe internal state
//! changes of tvix-eval.
//!
//! This can be used to gain insights from compilation, to trace the
//! runtime, and so on.
use crate::value::Lambda;
use std::rc::Rc;
/// Implemented by types that wish to observe internal happenings of
/// Tvix.
///
/// All methods are optional, that is, observers can implement only
/// what they are interested in observing.
pub trait Observer {
/// Called when the compiler finishes compilation of the top-level
/// of an expression (usually the root Nix expression of a file).
fn observe_compiled_toplevel(&mut self, _: &Rc<Lambda>) {}
/// Called when the compiler finishes compilation of a
/// user-defined function.
///
/// Note that in Nix there are only single argument functions, so
/// in an expression like `a: b: c: ...` this method will be
/// called three times.
fn observe_compiled_lambda(&mut self, _: &Rc<Lambda>) {}
/// Called when the compiler finishes compilation of a thunk.
fn observe_compiled_thunk(&mut self, _: &Rc<Lambda>) {}
}
#[derive(Default)]
pub struct NoOpObserver {}
impl Observer for NoOpObserver {}