refactor(corp/tvixbolt): adapt for tvix-eval's upcoming observer API

Instead of the previous hack which painfully threaded through
a structure that the disassembler could write to, Tvix's evaluator is
gaining a new "Observer" API which lets library clients observe
compilation output (and, soon!, runtime tracing).

This adapts tvixbolt to use this observer interface (with the default
`DisassemblingObserver`) to populate the `bytecode` field of its
output.

This is purely a mechanical change, no functionality is impacted.

Change-Id: I22bd2218629f30fd7351d4cc5ddcf639c12fea14
Reviewed-on: https://cl.tvl.fyi/c/depot/+/6316
Tested-by: BuildkiteCI
Reviewed-by: tazjin <tazjin@tvl.su>
This commit is contained in:
Vincent Ambo 2022-09-04 17:57:14 +03:00 committed by tazjin
parent 8655440ae3
commit 010a96e525
2 changed files with 12 additions and 13 deletions

View file

@ -17,4 +17,3 @@ rev = "97b438e34be5211a4b48aeed9cc3ded489b4d6da"
[dependencies.tvix-eval] [dependencies.tvix-eval]
path = "../tvix-eval/tvix/eval" path = "../tvix-eval/tvix/eval"
default-features = false default-features = false
features = [ "disassembler" ]

View file

@ -1,4 +1,7 @@
use std::{fmt::Write, rc::Rc}; use std::fmt::Write;
use std::rc::Rc;
use tvix_eval::observer::DisassemblingObserver;
use web_sys::HtmlTextAreaElement; use web_sys::HtmlTextAreaElement;
use yew::prelude::*; use yew::prelude::*;
use yew::TargetCast; use yew::TargetCast;
@ -107,7 +110,7 @@ impl Output {
fn eval(code: &str) -> Output { fn eval(code: &str) -> Output {
let mut out = Output::default(); let mut out = Output::default();
if code == "" { if code.is_empty() {
return out; return out;
} }
@ -131,21 +134,18 @@ fn eval(code: &str) -> Output {
.expr() .expr()
.expect("expression should exist if no errors occured"); .expect("expression should exist if no errors occured");
let mut result = tvix_eval::compiler::compile( let codemap = Rc::new(codemap);
let mut compilation_observer = DisassemblingObserver::new(codemap, &mut out.bytecode);
let result = tvix_eval::compile(
root_expr, root_expr,
Some("/nixbolt".into()), Some("/nixbolt".into()),
&file, &file,
tvix_eval::builtins::global_builtins(), tvix_eval::global_builtins(),
Rc::new(codemap), &mut compilation_observer,
) )
.unwrap(); .unwrap();
let lambda = Rc::new(result.lambda);
tvix_eval::disassembler::disassemble_lambda(&mut out.bytecode, lambda.clone());
out.bytecode.append(&mut result.output);
for warning in result.warnings { for warning in result.warnings {
writeln!( writeln!(
&mut out.warnings, &mut out.warnings,
@ -172,7 +172,7 @@ fn eval(code: &str) -> Output {
return out; return out;
} }
let result = tvix_eval::vm::run_lambda(lambda); let result = tvix_eval::run_lambda(result.lambda);
match result { match result {
Ok(value) => writeln!(&mut out.output, "{}", value).unwrap(), Ok(value) => writeln!(&mut out.output, "{}", value).unwrap(),