diff options
author | Vincent Ambo <mail@tazj.in> | 2022-10-04T15·27+0300 |
---|---|---|
committer | tazjin <tazjin@tvl.su> | 2022-10-06T15·22+0000 |
commit | b530e496a5962a3998773343d7ed6a9dd84b7753 (patch) | |
tree | fddfc94ef8f6a1cb711009d7fdd0d608337297b2 /tvix/eval/src/eval.rs | |
parent | 44acffc688aa61c363d050e28424041dc9cd0e33 (diff) |
feat(tvix/eval): initial implementation of `builtins.import` r/5041
This adds an initial working version of builtins.import which encapsulates the entire functionality of `import` within the builtin itself, without requiring any changes in the compiler or VM. The key insight that enables this is that we can simply return a Thunk from `import` that is constructed from the output of running the compiler and - ta-da! - no other component needs to know about it. A couple of notes: * builtins.import needs to capture variables like the SourceCode structure. This means it can not currently be constructed the same way as other builtins and has special handling, which leaks out to `eval.rs`. I have postponed dealing with that until we have this working a bit more. * the `globals` are not yet passed through * the error representation for the new variants is absolutely not done yet, we probably want to switch to something that supports cause-chaining now (like miette) * there is no mechanism for emitting warnings at runtime; we need to add that Change-Id: I3117a7ae3ff2432bf44f5ff05ad35f47faca31d5 Reviewed-on: https://cl.tvl.fyi/c/depot/+/6857 Reviewed-by: sterni <sternenseemann@systemli.org> Reviewed-by: wpcarro <wpcarro@gmail.com> Tested-by: BuildkiteCI Reviewed-by: grfn <grfn@gws.fyi>
Diffstat (limited to 'tvix/eval/src/eval.rs')
-rw-r--r-- | tvix/eval/src/eval.rs | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/tvix/eval/src/eval.rs b/tvix/eval/src/eval.rs index 7b7d3983d4ec..aed4292282b9 100644 --- a/tvix/eval/src/eval.rs +++ b/tvix/eval/src/eval.rs @@ -58,12 +58,21 @@ pub fn interpret(code: &str, location: Option<PathBuf>, options: Options) -> Eva println!("{:?}", root_expr); } + // TODO: encapsulate this import weirdness in builtins + let mut builtins = global_builtins(); + + #[cfg(feature = "impure")] + builtins.insert( + "import", + Value::Builtin(crate::builtins::impure::builtins_import(source.clone())), + ); + let result = if options.dump_bytecode { crate::compiler::compile( &root_expr, location, file.clone(), - global_builtins(), + builtins, &mut DisassemblingObserver::new(source.clone(), std::io::stderr()), ) } else { @@ -71,7 +80,7 @@ pub fn interpret(code: &str, location: Option<PathBuf>, options: Options) -> Eva &root_expr, location, file.clone(), - global_builtins(), + builtins, &mut NoOpObserver::default(), ) }?; |