about summary refs log tree commit diff
path: root/tvix/eval/src/vm
diff options
context:
space:
mode:
authorAspen Smith <root@gws.fyi>2024-02-01T17·28-0500
committeraspen <root@gws.fyi>2024-02-02T16·16+0000
commit5f0f4ea3746d6107839454bb5f4967d8757f5bb8 (patch)
treee618eca064cb7e263c58136f2c07b1dead63f49c /tvix/eval/src/vm
parent4c5d9fa356bcb6dcd746129dde934412b44fdd35 (diff)
refactor(tvix/eval): Box Value::String r/7467
NixString is *quite* large - like 80 bytes - because of the extra
capacity value for BString and because of the context. We want to keep
Value small since we're passing it around a lot, so let's box the
NixString inside Value::String to save on some memory, and make cloning
ostensibly a little cheaper

Change-Id: I343c8b4e7f61dc3dcbbaba4382efb3b3e5bbabb2
Reviewed-on: https://cl.tvl.fyi/c/depot/+/10729
Tested-by: BuildkiteCI
Reviewed-by: sterni <sternenseemann@systemli.org>
Diffstat (limited to 'tvix/eval/src/vm')
-rw-r--r--tvix/eval/src/vm/generators.rs4
-rw-r--r--tvix/eval/src/vm/mod.rs11
2 files changed, 8 insertions, 7 deletions
diff --git a/tvix/eval/src/vm/generators.rs b/tvix/eval/src/vm/generators.rs
index 3d2fd9d266c7..e5468fb06d4a 100644
--- a/tvix/eval/src/vm/generators.rs
+++ b/tvix/eval/src/vm/generators.rs
@@ -436,7 +436,7 @@ where
                                 })
                                 .with_span(&span, self)?;
 
-                            message = VMResponse::Value(Value::String(content.into()))
+                            message = VMResponse::Value(content.into())
                         }
 
                         VMRequest::PathExists(path) => {
@@ -607,7 +607,7 @@ pub async fn request_string_coerce(
     kind: CoercionKind,
 ) -> Result<NixString, CatchableErrorKind> {
     match val {
-        Value::String(s) => Ok(s),
+        Value::String(s) => Ok(*s),
         _ => match co.yield_(VMRequest::StringCoerce(val, kind)).await {
             VMResponse::Value(Value::Catchable(c)) => Err(c),
             VMResponse::Value(value) => Ok(value
diff --git a/tvix/eval/src/vm/mod.rs b/tvix/eval/src/vm/mod.rs
index 6e36edd95670..d23bef6743ef 100644
--- a/tvix/eval/src/vm/mod.rs
+++ b/tvix/eval/src/vm/mod.rs
@@ -987,9 +987,10 @@ where
             }
         }
 
-        // FIXME: consume immediately here the String.
         self.stack
-            .push(Value::String(NixString::new_context_from(context, out)));
+            .push(Value::String(Box::new(NixString::new_context_from(
+                context, out,
+            ))));
         Ok(())
     }
 
@@ -1250,7 +1251,7 @@ async fn add_values(co: GenCo, a: Value, b: Value) -> Result<Value, ErrorKind> {
                 Err(c) => Value::Catchable(c),
             }
         }
-        (Value::String(s1), Value::String(s2)) => Value::String(s1.concat(&s2)),
+        (Value::String(s1), Value::String(s2)) => Value::String(Box::new(s1.concat(&s2))),
         (Value::String(s1), v) => generators::request_string_coerce(
             &co,
             v,
@@ -1261,7 +1262,7 @@ async fn add_values(co: GenCo, a: Value, b: Value) -> Result<Value, ErrorKind> {
             },
         )
         .await
-        .map(|s2| Value::String(s1.concat(&s2)))
+        .map(|s2| Value::String(Box::new(s1.concat(&s2))))
         .into(),
         (a @ Value::Integer(_), b) | (a @ Value::Float(_), b) => arithmetic_op!(&a, &b, +)?,
         (a, b) => {
@@ -1284,7 +1285,7 @@ async fn add_values(co: GenCo, a: Value, b: Value) -> Result<Value, ErrorKind> {
             )
             .await;
             match (r1, r2) {
-                (Ok(s1), Ok(s2)) => Value::String(s1.concat(&s2)),
+                (Ok(s1), Ok(s2)) => Value::String(Box::new(s1.concat(&s2))),
                 (Err(c), _) => return Ok(Value::Catchable(c)),
                 (_, Err(c)) => return Ok(Value::Catchable(c)),
             }