feat(tvix/eval): crude caching builtins.import
Before this, tvix was spending most of its time furiously re-parsing and re-compiling nixpkgs, each time hoping to get a different result... Change-Id: I1c0cfbf9af622c276275b1f2fb8d4e976f1b5533 Signed-off-by: Adam Joseph <adam@westernsemico.com> Reviewed-on: https://cl.tvl.fyi/c/depot/+/7361 Reviewed-by: tazjin <tazjin@tvl.su> Tested-by: BuildkiteCI
This commit is contained in:
parent
7ffeb4f7f1
commit
8eb32fb2d7
2 changed files with 20 additions and 7 deletions
|
@ -122,6 +122,12 @@ pub fn builtins_import(globals: &Weak<GlobalsMap>, source: SourceCode) -> Builti
|
||||||
path.push("default.nix");
|
path.push("default.nix");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let current_span = vm.current_span();
|
||||||
|
let entry = match vm.import_cache.entry(path.clone()) {
|
||||||
|
std::collections::btree_map::Entry::Occupied(oe) => return Ok(oe.get().clone()),
|
||||||
|
std::collections::btree_map::Entry::Vacant(ve) => ve,
|
||||||
|
};
|
||||||
|
|
||||||
let contents =
|
let contents =
|
||||||
std::fs::read_to_string(&path).map_err(|err| ErrorKind::ReadFileError {
|
std::fs::read_to_string(&path).map_err(|err| ErrorKind::ReadFileError {
|
||||||
path: path.clone(),
|
path: path.clone(),
|
||||||
|
@ -167,16 +173,20 @@ pub fn builtins_import(globals: &Weak<GlobalsMap>, source: SourceCode) -> Builti
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Compilation succeeded, we can construct a thunk from whatever it spat
|
||||||
|
// out and return that.
|
||||||
|
let res = entry
|
||||||
|
.insert(Value::Thunk(Thunk::new_suspended(
|
||||||
|
result.lambda,
|
||||||
|
current_span,
|
||||||
|
)))
|
||||||
|
.clone();
|
||||||
|
|
||||||
for warning in result.warnings {
|
for warning in result.warnings {
|
||||||
vm.push_warning(warning);
|
vm.push_warning(warning);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Compilation succeeded, we can construct a thunk from whatever it spat
|
Ok(res)
|
||||||
// out and return that.
|
|
||||||
Ok(Value::Thunk(Thunk::new_suspended(
|
|
||||||
result.lambda,
|
|
||||||
vm.current_span(),
|
|
||||||
)))
|
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
//! Tvix bytecode.
|
//! Tvix bytecode.
|
||||||
|
|
||||||
use serde_json::json;
|
use serde_json::json;
|
||||||
use std::{cmp::Ordering, ops::DerefMut, path::PathBuf, rc::Rc};
|
use std::{cmp::Ordering, collections::BTreeMap, ops::DerefMut, path::PathBuf, rc::Rc};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
chunk::Chunk,
|
chunk::Chunk,
|
||||||
|
@ -60,6 +60,8 @@ pub struct VM<'o> {
|
||||||
/// Runtime warnings collected during evaluation.
|
/// Runtime warnings collected during evaluation.
|
||||||
warnings: Vec<EvalWarning>,
|
warnings: Vec<EvalWarning>,
|
||||||
|
|
||||||
|
pub import_cache: Box<BTreeMap<PathBuf, Value>>,
|
||||||
|
|
||||||
nix_search_path: NixSearchPath,
|
nix_search_path: NixSearchPath,
|
||||||
|
|
||||||
observer: &'o mut dyn RuntimeObserver,
|
observer: &'o mut dyn RuntimeObserver,
|
||||||
|
@ -164,6 +166,7 @@ impl<'o> VM<'o> {
|
||||||
stack: vec![],
|
stack: vec![],
|
||||||
with_stack: vec![],
|
with_stack: vec![],
|
||||||
warnings: vec![],
|
warnings: vec![],
|
||||||
|
import_cache: Default::default(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue