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

@ -53,7 +53,7 @@ pub async fn coerce_value_to_path(
) -> Result<Result<PathBuf, CatchableErrorKind>, ErrorKind> {
let value = generators::request_force(co, v).await;
if let Value::Path(p) = value {
return Ok(Ok(*p));
return Ok(Ok(p.into()));
}
match generators::request_string_coerce(
@ -400,8 +400,8 @@ mod pure_builtins {
})
.unwrap_or(b".");
if is_path {
Ok(Value::Path(Box::new(PathBuf::from(
OsString::assert_from_raw_vec(result.to_owned()),
Ok(Value::from(PathBuf::from(OsString::assert_from_raw_vec(
result.to_owned(),
))))
} else {
Ok(Value::String(NixString::new_inherit_context_from(
@ -1713,7 +1713,7 @@ mod placeholder_builtins {
let res = [
("line", 42.into()),
("col", 42.into()),
("file", Value::Path(Box::new("/deep/thought".into()))),
("file", Value::from(PathBuf::from("/deep/thought"))),
];
Ok(Value::attrs(NixAttrs::from_iter(res.into_iter())))
}