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:
parent
1fe6cfe5a2
commit
7ae45342df
2 changed files with 37 additions and 0 deletions
|
@ -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
36
tvix/eval/src/observer.rs
Normal 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 {}
|
Loading…
Reference in a new issue