refactor(tvix/eval): clone the Arc<codemap::File> for the compiler
This disconnects ownership of the `File` reference in a compiler from the calling scope, which is required for when we implement `import`. `import` will need to carry an `Rc<RefCell<CodeMap>>` (or maybe, in the future, Arc) to give us the ability to add new detected code files at runtime. Note that the choice of `Arc` over `Rc` here is not ours - it's the codemap crate's. Change-Id: I3aeca4ffc167acbd1701846a332d93550b56ba7d Reviewed-on: https://cl.tvl.fyi/c/depot/+/6630 Tested-by: BuildkiteCI Reviewed-by: grfn <grfn@gws.fyi>
This commit is contained in:
parent
5dd5c7e254
commit
0e5baae7ad
5 changed files with 12 additions and 11 deletions
|
@ -256,7 +256,7 @@ fn eval(trace: bool, code: &str) -> Output {
|
|||
let result = tvix_eval::compile(
|
||||
root_expr,
|
||||
Some("/nixbolt".into()),
|
||||
&file,
|
||||
file.clone(),
|
||||
tvix_eval::global_builtins(),
|
||||
&mut compilation_observer,
|
||||
)
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
|
||||
use super::*;
|
||||
|
||||
impl Compiler<'_, '_> {
|
||||
impl Compiler<'_> {
|
||||
pub(super) fn compile_attr(&mut self, slot: LocalIdx, node: ast::Attr) {
|
||||
match node {
|
||||
ast::Attr::Dynamic(dynamic) => {
|
||||
|
|
|
@ -24,6 +24,7 @@ use smol_str::SmolStr;
|
|||
use std::collections::HashMap;
|
||||
use std::path::{Path, PathBuf};
|
||||
use std::rc::Rc;
|
||||
use std::sync::Arc;
|
||||
|
||||
use crate::chunk::Chunk;
|
||||
use crate::errors::{Error, ErrorKind, EvalResult};
|
||||
|
@ -73,7 +74,7 @@ impl LambdaCtx {
|
|||
/// implicitly be resolvable in the global scope.
|
||||
type GlobalsMap = HashMap<&'static str, Rc<dyn Fn(&mut Compiler, rnix::ast::Ident)>>;
|
||||
|
||||
struct Compiler<'code, 'observer> {
|
||||
struct Compiler<'observer> {
|
||||
contexts: Vec<LambdaCtx>,
|
||||
warnings: Vec<EvalWarning>,
|
||||
errors: Vec<Error>,
|
||||
|
@ -90,7 +91,7 @@ struct Compiler<'code, 'observer> {
|
|||
/// File reference in the codemap contains all known source code
|
||||
/// and is used to track the spans from which instructions where
|
||||
/// derived.
|
||||
file: &'code codemap::File,
|
||||
file: Arc<codemap::File>,
|
||||
|
||||
/// Carry an observer for the compilation process, which is called
|
||||
/// whenever a chunk is emitted.
|
||||
|
@ -99,7 +100,7 @@ struct Compiler<'code, 'observer> {
|
|||
|
||||
// Helper functions for emitting code and metadata to the internal
|
||||
// structures of the compiler.
|
||||
impl Compiler<'_, '_> {
|
||||
impl Compiler<'_> {
|
||||
fn context(&self) -> &LambdaCtx {
|
||||
&self.contexts[self.contexts.len() - 1]
|
||||
}
|
||||
|
@ -137,7 +138,7 @@ impl Compiler<'_, '_> {
|
|||
}
|
||||
|
||||
// Actual code-emitting AST traversal methods.
|
||||
impl Compiler<'_, '_> {
|
||||
impl Compiler<'_> {
|
||||
fn compile(&mut self, slot: LocalIdx, expr: ast::Expr) {
|
||||
match expr {
|
||||
ast::Expr::Literal(literal) => self.compile_literal(literal),
|
||||
|
@ -1386,7 +1387,7 @@ fn prepare_globals(additional: HashMap<&'static str, Value>) -> GlobalsMap {
|
|||
pub fn compile(
|
||||
expr: ast::Expr,
|
||||
location: Option<PathBuf>,
|
||||
file: &codemap::File,
|
||||
file: Arc<codemap::File>,
|
||||
globals: HashMap<&'static str, Value>,
|
||||
observer: &mut dyn Observer,
|
||||
) -> EvalResult<CompilationOutput> {
|
||||
|
|
|
@ -77,8 +77,8 @@ expr_to_span!(ast::Str);
|
|||
expr_to_span!(ast::UnaryOp);
|
||||
expr_to_span!(ast::With);
|
||||
|
||||
impl Compiler<'_, '_> {
|
||||
impl Compiler<'_> {
|
||||
pub(super) fn span_for<S: ToSpan>(&self, to_span: &S) -> Span {
|
||||
to_span.span_for(self.file)
|
||||
to_span.span_for(&self.file)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -45,7 +45,7 @@ pub fn interpret(code: &str, location: Option<PathBuf>) -> EvalResult<Value> {
|
|||
crate::compiler::compile(
|
||||
root_expr,
|
||||
location,
|
||||
&file,
|
||||
file.clone(),
|
||||
global_builtins(),
|
||||
&mut DisassemblingObserver::new(codemap.clone(), std::io::stderr()),
|
||||
)
|
||||
|
@ -53,7 +53,7 @@ pub fn interpret(code: &str, location: Option<PathBuf>) -> EvalResult<Value> {
|
|||
crate::compiler::compile(
|
||||
root_expr,
|
||||
location,
|
||||
&file,
|
||||
file.clone(),
|
||||
global_builtins(),
|
||||
&mut NoOpObserver::default(),
|
||||
)
|
||||
|
|
Loading…
Reference in a new issue