From 43d04d9b985855cb431024d9895d52ea52fd4180 Mon Sep 17 00:00:00 2001 From: Vincent Ambo Date: Mon, 27 Feb 2023 13:50:16 +0300 Subject: refactor(tvix/eval): box PathBuf This shaves another 8 bytes off Value. How did that type get so big?! Change-Id: I65e9b59a1636bd57e3cc4aec5fea16887070b832 Reviewed-on: https://cl.tvl.fyi/c/depot/+/8153 Reviewed-by: raitobezarius Tested-by: BuildkiteCI --- tvix/eval/src/builtins/mod.rs | 6 +++--- tvix/eval/src/compiler/mod.rs | 9 ++++++--- tvix/eval/src/value/arbitrary.rs | 2 +- tvix/eval/src/value/mod.rs | 8 ++++---- tvix/eval/src/vm/mod.rs | 4 ++-- 5 files changed, 16 insertions(+), 13 deletions(-) (limited to 'tvix/eval/src') diff --git a/tvix/eval/src/builtins/mod.rs b/tvix/eval/src/builtins/mod.rs index 833a1dffa236..e19de961588d 100644 --- a/tvix/eval/src/builtins/mod.rs +++ b/tvix/eval/src/builtins/mod.rs @@ -42,7 +42,7 @@ pub const CURRENT_PLATFORM: &str = env!("TVIX_CURRENT_SYSTEM"); pub async fn coerce_value_to_path(co: &GenCo, v: Value) -> Result { let value = generators::request_force(co, v).await; if let Value::Path(p) = value { - return Ok(p); + return Ok(*p); } let vs = generators::request_string_coerce(co, value, CoercionKind::Weak).await; @@ -246,7 +246,7 @@ mod pure_builtins { }) .unwrap_or("."); if is_path { - Ok(Value::Path(result.into())) + Ok(Value::Path(Box::new(result.into()))) } else { Ok(result.into()) } @@ -1038,7 +1038,7 @@ mod placeholder_builtins { let res = [ ("line", 42.into()), ("col", 42.into()), - ("file", Value::Path("/deep/thought".into())), + ("file", Value::Path(Box::new("/deep/thought".into()))), ]; Ok(Value::attrs(NixAttrs::from_iter(res.into_iter()))) } diff --git a/tvix/eval/src/compiler/mod.rs b/tvix/eval/src/compiler/mod.rs index 80e1cd27c953..5460514ba1ed 100644 --- a/tvix/eval/src/compiler/mod.rs +++ b/tvix/eval/src/compiler/mod.rs @@ -342,7 +342,10 @@ impl Compiler<'_> { debug_assert!(raw_path.len() > 2 && raw_path.starts_with("~/")); let home_relative_path = &raw_path[2..(raw_path.len())]; - c.emit_constant(Value::UnresolvedPath(home_relative_path.into()), node); + c.emit_constant( + Value::UnresolvedPath(Box::new(home_relative_path.into())), + node, + ); c.push_op(OpCode::OpResolveHomePath, node); }); } else if raw_path.starts_with('<') { @@ -356,7 +359,7 @@ impl Compiler<'_> { let path = &raw_path[1..(raw_path.len() - 1)]; // Make a thunk to resolve the path (without using `findFile`, at least for now?) return self.thunk(slot, node, move |c, _| { - c.emit_constant(Value::UnresolvedPath(path.into()), node); + c.emit_constant(Value::UnresolvedPath(Box::new(path.into())), node); c.push_op(OpCode::OpFindFile, node); }); } else { @@ -367,7 +370,7 @@ impl Compiler<'_> { // TODO: Use https://github.com/rust-lang/rfcs/issues/2208 // once it is available - let value = Value::Path(crate::value::canon_path(path)); + let value = Value::Path(Box::new(crate::value::canon_path(path))); self.emit_constant(value, node); } diff --git a/tvix/eval/src/value/arbitrary.rs b/tvix/eval/src/value/arbitrary.rs index b00fdbd21ddf..bf53f4fcb28a 100644 --- a/tvix/eval/src/value/arbitrary.rs +++ b/tvix/eval/src/value/arbitrary.rs @@ -92,7 +92,7 @@ fn leaf_value() -> impl Strategy { any::().prop_map(Integer), any::().prop_map(Float), any::().prop_map(String), - any::().prop_map(|s| Path(s.into())), + any::().prop_map(|s| Path(Box::new(s.into()))), ] } diff --git a/tvix/eval/src/value/mod.rs b/tvix/eval/src/value/mod.rs index 81e537313227..4acdd135f4bb 100644 --- a/tvix/eval/src/value/mod.rs +++ b/tvix/eval/src/value/mod.rs @@ -49,7 +49,7 @@ pub enum Value { String(NixString), #[serde(skip)] - Path(PathBuf), + Path(Box), Attrs(Box), List(NixList), @@ -75,7 +75,7 @@ pub enum Value { #[serde(skip)] DeferredUpvalue(StackIdx), #[serde(skip)] - UnresolvedPath(PathBuf), + UnresolvedPath(Box), } lazy_static! { @@ -256,7 +256,7 @@ impl Value { // Unicode. See also b/189. (Value::Path(p), _) => { // TODO(tazjin): there are cases where coerce_to_string does not import - let imported = generators::request_path_import(&co, p).await; + let imported = generators::request_path_import(&co, *p).await; Ok(imported.to_string_lossy().into_owned().into()) } @@ -800,7 +800,7 @@ impl From for Value { impl From for Value { fn from(path: PathBuf) -> Self { - Self::Path(path) + Self::Path(Box::new(path)) } } diff --git a/tvix/eval/src/vm/mod.rs b/tvix/eval/src/vm/mod.rs index 4d38707ba023..e104c3d2e7f9 100644 --- a/tvix/eval/src/vm/mod.rs +++ b/tvix/eval/src/vm/mod.rs @@ -557,7 +557,7 @@ impl<'o> VM<'o> { OpCode::OpFindFile => match self.stack_pop() { Value::UnresolvedPath(path) => { - let resolved = self.nix_search_path.resolve(path).with_span(&frame)?; + let resolved = self.nix_search_path.resolve(*path).with_span(&frame)?; self.stack.push(resolved.into()); } @@ -573,7 +573,7 @@ impl<'o> VM<'o> { ))); } Some(mut buf) => { - buf.push(path); + buf.push(*path); self.stack.push(buf.into()); } }; -- cgit 1.4.1