refactor(tvix/eval): Don't double-box Path values

PathBuf internally contains a heap pointer (an OsString), so we were in
effect double-boxing here. Removing the extra layer by making
Tvix::Value represented by a Box<Path> rather than a Box<PathBuf> saves
us an indirection, while still avoiding the extra memory overhead of the
capacity which was the reason we were boxing PathBuf in the first place.

Change-Id: I8c185b9d4646161d1921917f83e87421496a3e24
Reviewed-on: https://cl.tvl.fyi/c/depot/+/10725
Reviewed-by: sterni <sternenseemann@systemli.org>
Autosubmit: aspen <root@gws.fyi>
Tested-by: BuildkiteCI
This commit is contained in:
Aspen Smith 2024-01-31 10:19:13 -05:00 committed by aspen
parent 201173afac
commit d3d41552cf
6 changed files with 23 additions and 20 deletions

View file

@ -862,7 +862,7 @@ where
Value::UnresolvedPath(path) => {
let resolved = self
.nix_search_path
.resolve(&self.io_handle, *path)
.resolve(&self.io_handle, path)
.with_span(&frame, self)?;
self.stack.push(resolved.into());
}
@ -882,7 +882,7 @@ where
);
}
Some(mut buf) => {
buf.push(*path);
buf.push(path);
self.stack.push(buf.into());
}
};
@ -1222,7 +1222,7 @@ async fn add_values(co: GenCo, a: Value, b: Value) -> Result<Value, ErrorKind> {
// What we try to do is solely determined by the type of the first value!
let result = match (a, b) {
(Value::Path(p), v) => {
let mut path = p.into_os_string();
let mut path = p.as_os_str().to_owned();
match generators::request_string_coerce(
&co,
v,