about summary refs log tree commit diff
diff options
context:
space:
mode:
authorVincent Ambo <mail@tazj.in>2023-02-27T10·50+0300
committertazjin <tazjin@tvl.su>2023-03-13T20·30+0000
commit43d04d9b985855cb431024d9895d52ea52fd4180 (patch)
treedbf61bc1bff75a9163050ac2e8e97bb4b582c47b
parent52b7a762681fb04ae9387c2f1951a36bf83ebc79 (diff)
refactor(tvix/eval): box PathBuf r/5969
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 <tvl@lahfa.xyz>
Tested-by: BuildkiteCI
-rw-r--r--tvix/eval/src/builtins/mod.rs6
-rw-r--r--tvix/eval/src/compiler/mod.rs9
-rw-r--r--tvix/eval/src/value/arbitrary.rs2
-rw-r--r--tvix/eval/src/value/mod.rs8
-rw-r--r--tvix/eval/src/vm/mod.rs4
5 files changed, 16 insertions, 13 deletions
diff --git a/tvix/eval/src/builtins/mod.rs b/tvix/eval/src/builtins/mod.rs
index 833a1dffa2..e19de96158 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<PathBuf, ErrorKind> {
     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 80e1cd27c9..5460514ba1 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 b00fdbd21d..bf53f4fcb2 100644
--- a/tvix/eval/src/value/arbitrary.rs
+++ b/tvix/eval/src/value/arbitrary.rs
@@ -92,7 +92,7 @@ fn leaf_value() -> impl Strategy<Value = Value> {
         any::<i64>().prop_map(Integer),
         any::<f64>().prop_map(Float),
         any::<NixString>().prop_map(String),
-        any::<OsString>().prop_map(|s| Path(s.into())),
+        any::<OsString>().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 81e5373132..4acdd135f4 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<PathBuf>),
     Attrs(Box<NixAttrs>),
     List(NixList),
 
@@ -75,7 +75,7 @@ pub enum Value {
     #[serde(skip)]
     DeferredUpvalue(StackIdx),
     #[serde(skip)]
-    UnresolvedPath(PathBuf),
+    UnresolvedPath(Box<PathBuf>),
 }
 
 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<f64> for Value {
 
 impl From<PathBuf> 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 4d38707ba0..e104c3d2e7 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());
                             }
                         };