feat(tvix/eval): implement DisassemblingObserver for compiler

This type implements an observer that is called whenever the compiler
emits a chunk (after the toplevel, thunks, or lambdas) and prints the
output of the disassembler to its internal writer.

This replaces half of the uses of the `disassembler` feature, which
has been removed from the Cargo configuration.

Note that at this commit runtime tracing is not yet implemented as an
observer.

Change-Id: I7894ca1ba445761aba4ad51d98e4a7b6445f1aea
Reviewed-on: https://cl.tvl.fyi/c/depot/+/6449
Reviewed-by: sterni <sternenseemann@systemli.org>
Tested-by: BuildkiteCI
This commit is contained in:
Vincent Ambo 2022-09-04 16:56:20 +03:00 committed by tazjin
parent 7ae45342df
commit 8ee4d6d5db
7 changed files with 111 additions and 98 deletions

View file

@ -28,9 +28,6 @@ pub struct Chunk {
pub code: Vec<OpCode>,
pub constants: Vec<Value>,
spans: Vec<SourceSpan>,
#[cfg(feature = "disassembler")]
pub codemap: std::rc::Rc<codemap::CodeMap>,
}
impl Index<ConstantIdx> for Chunk {
@ -93,11 +90,11 @@ impl Chunk {
}
/// Retrieve the line from which the instruction at `offset` was
/// compiled. Only available when the chunk carries a codemap,
/// i.e. when the disassembler is enabled.
#[cfg(feature = "disassembler")]
pub fn get_line(&self, offset: CodeIdx) -> usize {
/// compiled in the specified codemap.
pub fn get_line(&self, codemap: &codemap::CodeMap, offset: CodeIdx) -> usize {
let span = self.get_span(offset);
self.codemap.look_up_span(span).begin.line + 1
// lines are 0-indexed in the codemap, but users probably want
// real line numbers
codemap.look_up_span(span).begin.line + 1
}
}