about summary refs log tree commit diff
path: root/tvix/eval
diff options
context:
space:
mode:
authorRyan Lahfa <tvl@lahfa.xyz>2023-12-27T17·13+0100
committerclbot <clbot@tvl.fyi>2024-01-03T18·08+0000
commit7dcb37fc52090636d542f9d8d0d45a00a5c24c55 (patch)
treee49fa138ea77941c8ba301cf7adc094fd2581573 /tvix/eval
parent375f7eaa59d5043be91ae0bbd47f3305628790d5 (diff)
feat(tvix/eval): context-aware `substring` r/7324
`substring` has a very funny behavior when it comes to empty strings,
it propagates the context too, this is used in nixpkgs to attach context
to strings without using any builtin: `lib.addContextFrom`.

Change-Id: Id655356799b3485f7519b3d1914c630f9d8416c3
Reviewed-on: https://cl.tvl.fyi/c/depot/+/10448
Autosubmit: raitobezarius <tvl@lahfa.xyz>
Reviewed-by: tazjin <tazjin@tvl.su>
Tested-by: BuildkiteCI
Diffstat (limited to 'tvix/eval')
-rw-r--r--tvix/eval/src/builtins/mod.rs9
1 files changed, 6 insertions, 3 deletions
diff --git a/tvix/eval/src/builtins/mod.rs b/tvix/eval/src/builtins/mod.rs
index ee551bbaf5f6..eaa1d1f98d5d 100644
--- a/tvix/eval/src/builtins/mod.rs
+++ b/tvix/eval/src/builtins/mod.rs
@@ -1081,7 +1081,7 @@ mod pure_builtins {
         if x.is_catchable() {
             return Ok(x);
         }
-        let x = x.to_str()?;
+        let x = x.to_contextful_str()?;
 
         if beg < 0 {
             return Err(ErrorKind::IndexOutOfBounds { index: beg });
@@ -1092,7 +1092,7 @@ mod pure_builtins {
         // non-negative when the starting index is GTE the
         // string's length.
         if beg >= x.as_str().len() {
-            return Ok(Value::String("".into()));
+            return Ok(Value::String(NixString::new_inherit_context_from(&x, "")));
         }
 
         let end = if len < 0 {
@@ -1101,7 +1101,10 @@ mod pure_builtins {
             cmp::min(beg + (len as usize), x.as_str().len())
         };
 
-        Ok(Value::String(x.as_bytes()[beg..end].try_into()?))
+        Ok(Value::String(NixString::new_inherit_context_from(
+            &x,
+            &x[beg..end],
+        )))
     }
 
     #[builtin("tail")]