diff options
author | Adam Joseph <adam@westernsemico.com> | 2023-12-11T09·04-0800 |
---|---|---|
committer | clbot <clbot@tvl.fyi> | 2023-12-12T14·36+0000 |
commit | 370137974526ef9af1f0d3496d17e4232e3babfe (patch) | |
tree | 338546dc311f221db73e191953dfb1af2ddb2d60 /tvix/eval/src/vm/generators.rs | |
parent | c956138ee6c158c12f5c5eb3568aea1b0aea7494 (diff) |
feat(tvix/eval): nonrecursive deep_force() r/7175
This commit implements deep_force() nonrecursively, by maintaining an explicit stack rather than using the call stack for recursion. As an added bonus, we don't need to pass around the SharedThunkSet anymore, and can in fact completely eliminate SharedThunkSet. Change-Id: I7c4f59f37834d451a28bf6be317eb0a90eac4ee6 Reviewed-on: https://cl.tvl.fyi/c/depot/+/10252 Tested-by: BuildkiteCI Reviewed-by: tazjin <tazjin@tvl.su> Autosubmit: Adam Joseph <adam@westernsemico.com>
Diffstat (limited to 'tvix/eval/src/vm/generators.rs')
-rw-r--r-- | tvix/eval/src/vm/generators.rs | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/tvix/eval/src/vm/generators.rs b/tvix/eval/src/vm/generators.rs index 4fff498fe7c6..7b92c1f0af35 100644 --- a/tvix/eval/src/vm/generators.rs +++ b/tvix/eval/src/vm/generators.rs @@ -13,7 +13,7 @@ pub use genawaiter::rc::Gen; use std::fmt::Display; use std::future::Future; -use crate::value::{PointerEquality, SharedThunkSet}; +use crate::value::PointerEquality; use crate::warnings::{EvalWarning, WarningKind}; use crate::FileType; use crate::NixString; @@ -43,7 +43,7 @@ pub enum VMRequest { ForceValue(Value), /// Request that the VM deep-forces the value. - DeepForceValue(Value, SharedThunkSet), + DeepForceValue(Value), /// Request the value at the given index from the VM's with-stack, in forced /// state. @@ -128,7 +128,7 @@ impl Display for VMRequest { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { VMRequest::ForceValue(v) => write!(f, "force_value({})", v.type_of()), - VMRequest::DeepForceValue(v, _) => { + VMRequest::DeepForceValue(v) => { write!(f, "deep_force_value({})", v.type_of()) } VMRequest::WithValue(_) => write!(f, "with_value"), @@ -294,10 +294,10 @@ impl<'o> VM<'o> { } // Generator has requested a deep-force. - VMRequest::DeepForceValue(value, thunk_set) => { + VMRequest::DeepForceValue(value) => { self.reenqueue_generator(name, span.clone(), generator); - self.enqueue_generator("deep_force", span, |co| { - value.deep_force(co, thunk_set) + self.enqueue_generator("deep_force", span.clone(), |co| { + value.deep_force(co, span) }); return Ok(false); } @@ -606,8 +606,8 @@ pub async fn request_string_coerce( } /// Deep-force any value and return the evaluated result from the VM. -pub async fn request_deep_force(co: &GenCo, val: Value, thunk_set: SharedThunkSet) -> Value { - match co.yield_(VMRequest::DeepForceValue(val, thunk_set)).await { +pub async fn request_deep_force(co: &GenCo, val: Value) -> Value { + match co.yield_(VMRequest::DeepForceValue(val)).await { VMResponse::Value(value) => value, msg => panic!( "Tvix bug: VM responded with incorrect generator message: {}", |