about summary refs log tree commit diff
path: root/tvix/eval/src
diff options
context:
space:
mode:
authorsterni <sternenseemann@systemli.org>2024-03-15T13·36+0100
committerclbot <clbot@tvl.fyi>2024-03-19T06·20+0000
commitd1b7e0872608b2d78ddcb2ee473ec9bdbf9695a8 (patch)
treeef078e753eb30db88c4171296329de928a801610 /tvix/eval/src
parent3633d846f88d8306dabd5e820d0f3cd999404050 (diff)
fix(tvix/eval): don't force lambda arg in map, mapAttrs & genList r/7735
It is pretty pointless to force the function argument if we are going to
use a suspended call later since forcing the function may fail in ways
that are not covered by Catchables (non-recoverable errors, infinite
recursions). From this, it kind of seems as if using #[catch] is never
correct and should be replaced by #[lazy]. Also we should probably try
to come up with more test cases for stuff where laziness gets us out of
the jam as an equivalent to the catchable tests for nonrecoverable
errors.

Fixes b/386.

Change-Id: Ia926df4ac1b440ec430403ab7b40924a0c97221b
Reviewed-on: https://cl.tvl.fyi/c/depot/+/11153
Reviewed-by: tazjin <tazjin@tvl.su>
Tested-by: BuildkiteCI
Autosubmit: sterni <sternenseemann@systemli.org>
Diffstat (limited to 'tvix/eval/src')
-rw-r--r--tvix/eval/src/builtins/mod.rs10
-rw-r--r--tvix/eval/src/tests/tvix_tests/eval-okay-builtins-genList-function-strictness.exp1
-rw-r--r--tvix/eval/src/tests/tvix_tests/eval-okay-builtins-genList-function-strictness.nix8
-rw-r--r--tvix/eval/src/tests/tvix_tests/eval-okay-builtins-map-function-strictness.exp1
-rw-r--r--tvix/eval/src/tests/tvix_tests/eval-okay-builtins-map-function-strictness.nix8
-rw-r--r--tvix/eval/src/tests/tvix_tests/eval-okay-builtins-mapAttrs-function-strictness.exp1
-rw-r--r--tvix/eval/src/tests/tvix_tests/eval-okay-builtins-mapAttrs-function-strictness.nix8
7 files changed, 34 insertions, 3 deletions
diff --git a/tvix/eval/src/builtins/mod.rs b/tvix/eval/src/builtins/mod.rs
index a2136ee6ad05..b19ba7009f2f 100644
--- a/tvix/eval/src/builtins/mod.rs
+++ b/tvix/eval/src/builtins/mod.rs
@@ -523,7 +523,7 @@ mod pure_builtins {
     async fn builtin_gen_list(
         co: GenCo,
         // Nix 2.3 doesn't propagate failures here
-        #[catch] generator: Value,
+        #[lazy] generator: Value,
         length: Value,
     ) -> Result<Value, ErrorKind> {
         let mut out = imbl::Vector::<Value>::new();
@@ -905,7 +905,7 @@ mod pure_builtins {
     }
 
     #[builtin("map")]
-    async fn builtin_map(co: GenCo, #[catch] f: Value, list: Value) -> Result<Value, ErrorKind> {
+    async fn builtin_map(co: GenCo, #[lazy] f: Value, list: Value) -> Result<Value, ErrorKind> {
         let mut out = imbl::Vector::<Value>::new();
 
         // the best span we can get…
@@ -920,7 +920,11 @@ mod pure_builtins {
     }
 
     #[builtin("mapAttrs")]
-    async fn builtin_map_attrs(co: GenCo, f: Value, attrs: Value) -> Result<Value, ErrorKind> {
+    async fn builtin_map_attrs(
+        co: GenCo,
+        #[lazy] f: Value,
+        attrs: Value,
+    ) -> Result<Value, ErrorKind> {
         let attrs = attrs.to_attrs()?;
         let mut out = imbl::OrdMap::new();
 
diff --git a/tvix/eval/src/tests/tvix_tests/eval-okay-builtins-genList-function-strictness.exp b/tvix/eval/src/tests/tvix_tests/eval-okay-builtins-genList-function-strictness.exp
new file mode 100644
index 000000000000..06712ebc33e4
--- /dev/null
+++ b/tvix/eval/src/tests/tvix_tests/eval-okay-builtins-genList-function-strictness.exp
@@ -0,0 +1 @@
+[ <LAMBDA> 0 1 2 ]
diff --git a/tvix/eval/src/tests/tvix_tests/eval-okay-builtins-genList-function-strictness.nix b/tvix/eval/src/tests/tvix_tests/eval-okay-builtins-genList-function-strictness.nix
new file mode 100644
index 000000000000..e161e3b4af4f
--- /dev/null
+++ b/tvix/eval/src/tests/tvix_tests/eval-okay-builtins-genList-function-strictness.nix
@@ -0,0 +1,8 @@
+let
+  self =
+    let
+      l = builtins.genList (builtins.head self) 3;
+    in
+    [ (x: x) ] ++ l;
+in
+self
diff --git a/tvix/eval/src/tests/tvix_tests/eval-okay-builtins-map-function-strictness.exp b/tvix/eval/src/tests/tvix_tests/eval-okay-builtins-map-function-strictness.exp
new file mode 100644
index 000000000000..050c2c4de51f
--- /dev/null
+++ b/tvix/eval/src/tests/tvix_tests/eval-okay-builtins-map-function-strictness.exp
@@ -0,0 +1 @@
+[ <LAMBDA> 2 "." 18 "https://github.com/NixOS/nix/issues/9779" "-.-" ]
diff --git a/tvix/eval/src/tests/tvix_tests/eval-okay-builtins-map-function-strictness.nix b/tvix/eval/src/tests/tvix_tests/eval-okay-builtins-map-function-strictness.nix
new file mode 100644
index 000000000000..932d3d0eaebc
--- /dev/null
+++ b/tvix/eval/src/tests/tvix_tests/eval-okay-builtins-map-function-strictness.nix
@@ -0,0 +1,8 @@
+let
+  self =
+    let
+      l = builtins.map (builtins.head self) [ 2 "." 18 https://github.com/NixOS/nix/issues/9779 "-.-" ];
+    in
+    [ (x: x) ] ++ l;
+in
+self
diff --git a/tvix/eval/src/tests/tvix_tests/eval-okay-builtins-mapAttrs-function-strictness.exp b/tvix/eval/src/tests/tvix_tests/eval-okay-builtins-mapAttrs-function-strictness.exp
new file mode 100644
index 000000000000..7e70748ffd6f
--- /dev/null
+++ b/tvix/eval/src/tests/tvix_tests/eval-okay-builtins-mapAttrs-function-strictness.exp
@@ -0,0 +1 @@
+{ a = 1; b = 2; f = <LAMBDA>; }
diff --git a/tvix/eval/src/tests/tvix_tests/eval-okay-builtins-mapAttrs-function-strictness.nix b/tvix/eval/src/tests/tvix_tests/eval-okay-builtins-mapAttrs-function-strictness.nix
new file mode 100644
index 000000000000..2946d6de1760
--- /dev/null
+++ b/tvix/eval/src/tests/tvix_tests/eval-okay-builtins-mapAttrs-function-strictness.nix
@@ -0,0 +1,8 @@
+let
+  self =
+    let
+      s = builtins.mapAttrs self.f { a = 1; b = 2; };
+    in
+    { f = _: x: x; } // s;
+in
+self