about summary refs log tree commit diff
path: root/tvix/eval/src/value/thunk.rs
diff options
context:
space:
mode:
authorAdam Joseph <adam@westernsemico.com>2023-11-25T09·38-0800
committerclbot <clbot@tvl.fyi>2023-12-12T14·26+0000
commit72ece2e5184df7cb2099e54ace01154a4043d289 (patch)
tree7ad4cefb7973f0bbc10e1ff7edd2e5861b341119 /tvix/eval/src/value/thunk.rs
parent0c15a09b1589de8bbd7f843ec213147d5f089d73 (diff)
feat(tvix/eval): nonrecursive nix_eq() r/7164
This commit rewrites Value::nix_eq() into an equivalent.  Except for
calls to Thunk::force(), the new form no longer uses generators, and
is async only because of the fact that it calls Thunk::force().

I believed that the nonrecursive form would be faster.  It is, in
fact, slightly slower.  I believe this is due to the vec![]
allocation; I am investigating.

Prev-Nixpkgs-Benchmark: {"attrpath":"pkgsCross.aarch64-multiplatform.hello.outPath","peak-kbytes":"459068","system-seconds":"0.71","user-seconds":"5.39"}
This-Nixpkgs-Benchmark: {"attrpath":"pkgsCross.aarch64-multiplatform.hello.outPath","peak-kbytes":"460048","system-seconds":"0.68","user-seconds":"5.73"}
Change-Id: I10f4868891e4b7475df13f0cbc41ec78dd985dd8
Reviewed-on: https://cl.tvl.fyi/c/depot/+/10118
Reviewed-by: tazjin <tazjin@tvl.su>
Tested-by: BuildkiteCI
Autosubmit: Adam Joseph <adam@westernsemico.com>
Diffstat (limited to 'tvix/eval/src/value/thunk.rs')
-rw-r--r--tvix/eval/src/value/thunk.rs11
1 files changed, 9 insertions, 2 deletions
diff --git a/tvix/eval/src/value/thunk.rs b/tvix/eval/src/value/thunk.rs
index 3ff3bde659..345903237b 100644
--- a/tvix/eval/src/value/thunk.rs
+++ b/tvix/eval/src/value/thunk.rs
@@ -205,7 +205,14 @@ impl Thunk {
         }
     }
 
-    pub async fn force(mut myself: Thunk, co: GenCo, span: LightSpan) -> Result<Value, ErrorKind> {
+    pub async fn force(myself: Thunk, co: GenCo, span: LightSpan) -> Result<Value, ErrorKind> {
+        Self::force_(myself, &co, span).await
+    }
+    pub async fn force_(
+        mut myself: Thunk,
+        co: &GenCo,
+        span: LightSpan,
+    ) -> Result<Value, ErrorKind> {
         // This vector of "thunks which point to the thunk-being-forced", to
         // be updated along with it, is necessary in order to write this
         // function in iterative (and later, mutual-tail-call) form.
@@ -261,7 +268,7 @@ impl Thunk {
                     // be turned into a tailcall to vm::execute_bytecode() by
                     // passing `also_update` to it.
                     let value =
-                        generators::request_enter_lambda(&co, lambda, upvalues, light_span).await;
+                        generators::request_enter_lambda(co, lambda, upvalues, light_span).await;
                     myself.0.replace(ThunkRepr::Evaluated(value));
                     continue;
                 }