chore(tvix/eval): thread a codemap::File reference to the compiler
This instantiates a codemap outside of the compiler and passes a reference to the file currently under compilation to it. Note that the "file" might just be a REPL line. Change-Id: I131ae1ddb6d718e1374750da9ba0b99608c6058d Reviewed-on: https://cl.tvl.fyi/c/depot/+/6378 Tested-by: BuildkiteCI Reviewed-by: sterni <sternenseemann@systemli.org>
This commit is contained in:
parent
b9566da5c9
commit
c5a8b93eaf
2 changed files with 21 additions and 5 deletions
|
@ -59,7 +59,7 @@ impl LambdaCtx {
|
||||||
/// implicitly be resolvable in the global scope.
|
/// implicitly be resolvable in the global scope.
|
||||||
type GlobalsMap = HashMap<&'static str, Rc<dyn Fn(&mut Compiler)>>;
|
type GlobalsMap = HashMap<&'static str, Rc<dyn Fn(&mut Compiler)>>;
|
||||||
|
|
||||||
struct Compiler {
|
struct Compiler<'code> {
|
||||||
contexts: Vec<LambdaCtx>,
|
contexts: Vec<LambdaCtx>,
|
||||||
warnings: Vec<EvalWarning>,
|
warnings: Vec<EvalWarning>,
|
||||||
errors: Vec<Error>,
|
errors: Vec<Error>,
|
||||||
|
@ -72,11 +72,16 @@ struct Compiler {
|
||||||
/// an identifier is resolved against the scope poisoning logic,
|
/// an identifier is resolved against the scope poisoning logic,
|
||||||
/// and a function that should emit code for the token.
|
/// and a function that should emit code for the token.
|
||||||
globals: GlobalsMap,
|
globals: GlobalsMap,
|
||||||
|
|
||||||
|
/// 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,
|
||||||
}
|
}
|
||||||
|
|
||||||
// Helper functions for emitting code and metadata to the internal
|
// Helper functions for emitting code and metadata to the internal
|
||||||
// structures of the compiler.
|
// structures of the compiler.
|
||||||
impl Compiler {
|
impl Compiler<'_> {
|
||||||
fn context(&self) -> &LambdaCtx {
|
fn context(&self) -> &LambdaCtx {
|
||||||
&self.contexts[self.contexts.len() - 1]
|
&self.contexts[self.contexts.len() - 1]
|
||||||
}
|
}
|
||||||
|
@ -110,7 +115,7 @@ impl Compiler {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Actual code-emitting AST traversal methods.
|
// Actual code-emitting AST traversal methods.
|
||||||
impl Compiler {
|
impl Compiler<'_> {
|
||||||
fn compile(&mut self, slot: Option<LocalIdx>, expr: ast::Expr) {
|
fn compile(&mut self, slot: Option<LocalIdx>, expr: ast::Expr) {
|
||||||
match expr {
|
match expr {
|
||||||
ast::Expr::Literal(literal) => self.compile_literal(literal),
|
ast::Expr::Literal(literal) => self.compile_literal(literal),
|
||||||
|
@ -1257,9 +1262,10 @@ fn prepare_globals(additional: HashMap<&'static str, Value>) -> GlobalsMap {
|
||||||
globals
|
globals
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn compile(
|
pub fn compile<'code>(
|
||||||
expr: ast::Expr,
|
expr: ast::Expr,
|
||||||
location: Option<PathBuf>,
|
location: Option<PathBuf>,
|
||||||
|
file: &'code codemap::File,
|
||||||
globals: HashMap<&'static str, Value>,
|
globals: HashMap<&'static str, Value>,
|
||||||
) -> EvalResult<CompilationOutput> {
|
) -> EvalResult<CompilationOutput> {
|
||||||
let mut root_dir = match location {
|
let mut root_dir = match location {
|
||||||
|
@ -1278,6 +1284,7 @@ pub fn compile(
|
||||||
|
|
||||||
let mut c = Compiler {
|
let mut c = Compiler {
|
||||||
root_dir,
|
root_dir,
|
||||||
|
file,
|
||||||
globals: prepare_globals(globals),
|
globals: prepare_globals(globals),
|
||||||
contexts: vec![LambdaCtx::new()],
|
contexts: vec![LambdaCtx::new()],
|
||||||
warnings: vec![],
|
warnings: vec![],
|
||||||
|
|
|
@ -7,6 +7,15 @@ use crate::{
|
||||||
};
|
};
|
||||||
|
|
||||||
pub fn interpret(code: &str, location: Option<PathBuf>) -> EvalResult<Value> {
|
pub fn interpret(code: &str, location: Option<PathBuf>) -> EvalResult<Value> {
|
||||||
|
let mut codemap = codemap::CodeMap::new();
|
||||||
|
let file = codemap.add_file(
|
||||||
|
location
|
||||||
|
.as_ref()
|
||||||
|
.map(|p| p.to_string_lossy().to_string())
|
||||||
|
.unwrap_or_else(|| "<repl>".into()),
|
||||||
|
code.into(),
|
||||||
|
);
|
||||||
|
|
||||||
let parsed = rnix::ast::Root::parse(code);
|
let parsed = rnix::ast::Root::parse(code);
|
||||||
let errors = parsed.errors();
|
let errors = parsed.errors();
|
||||||
|
|
||||||
|
@ -27,7 +36,7 @@ pub fn interpret(code: &str, location: Option<PathBuf>) -> EvalResult<Value> {
|
||||||
println!("{:?}", root_expr);
|
println!("{:?}", root_expr);
|
||||||
}
|
}
|
||||||
|
|
||||||
let result = crate::compiler::compile(root_expr, location, global_builtins())?;
|
let result = crate::compiler::compile(root_expr, location, &file, global_builtins())?;
|
||||||
|
|
||||||
#[cfg(feature = "disassembler")]
|
#[cfg(feature = "disassembler")]
|
||||||
crate::disassembler::disassemble_chunk(&result.lambda.chunk);
|
crate::disassembler::disassemble_chunk(&result.lambda.chunk);
|
||||||
|
|
Loading…
Reference in a new issue