From cc526a2c873524faa83cad62bde2edda59ea7820 Mon Sep 17 00:00:00 2001 From: Vincent Ambo Date: Fri, 2 Sep 2022 17:44:31 +0300 Subject: feat(tvix/eval): thread codemap through to disassembler If the disassembler feature is enabled, make sure that an Rc of the codemap is available through the chunk. Change-Id: I700f27ab665a704f73457b19bd2d7efc93828a16 Reviewed-on: https://cl.tvl.fyi/c/depot/+/6414 Reviewed-by: sterni Tested-by: BuildkiteCI --- tvix/eval/src/compiler/mod.rs | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) (limited to 'tvix/eval/src/compiler/mod.rs') diff --git a/tvix/eval/src/compiler/mod.rs b/tvix/eval/src/compiler/mod.rs index 2d499564077d..3ea27f843cf2 100644 --- a/tvix/eval/src/compiler/mod.rs +++ b/tvix/eval/src/compiler/mod.rs @@ -55,10 +55,18 @@ impl LambdaCtx { } fn inherit(&self) -> Self { - LambdaCtx { + let ctx = LambdaCtx { lambda: Lambda::new_anonymous(), scope: self.scope.inherit(), - } + }; + + #[cfg(feature = "disassembler")] + let ctx = (|mut c: Self| { + c.lambda.chunk.codemap = self.lambda.chunk.codemap.clone(); + c + })(ctx); + + ctx } } @@ -84,6 +92,12 @@ struct Compiler<'code> { /// and is used to track the spans from which instructions where /// derived. file: &'code codemap::File, + + #[cfg(feature = "disassembler")] + /// Carry a reference to the codemap around when the disassembler + /// is enabled, to allow displaying lines and other source + /// information in the disassembler output. + codemap: Rc, } // Helper functions for emitting code and metadata to the internal @@ -1331,6 +1345,8 @@ pub fn compile<'code>( location: Option, file: &'code codemap::File, globals: HashMap<&'static str, Value>, + + #[cfg(feature = "disassembler")] codemap: Rc, ) -> EvalResult { let mut root_dir = match location { Some(dir) => Ok(dir), @@ -1353,12 +1369,19 @@ pub fn compile<'code>( let mut c = Compiler { root_dir, file, + #[cfg(feature = "disassembler")] + codemap, globals: prepare_globals(globals), contexts: vec![LambdaCtx::new()], warnings: vec![], errors: vec![], }; + #[cfg(feature = "disassembler")] + { + c.context_mut().lambda.chunk.codemap = c.codemap.clone(); + } + c.compile(None, expr.clone()); // The final operation of any top-level Nix program must always be -- cgit 1.4.1