diff options
author | Griffin Smith <grfn@gws.fyi> | 2022-10-13T02·47-0400 |
---|---|---|
committer | grfn <grfn@gws.fyi> | 2022-10-22T18·11+0000 |
commit | d4fa3152e92ef72d9ee050000b1fd4952203e383 (patch) | |
tree | 288cd7bd6f47169aec08e402edd0cf5fb90560fa /tvix/eval/src/value/list.rs | |
parent | 8724d2fff871827dc66503f9b3dfa1d29149ddc7 (diff) |
feat(tvix/eval): Implement builtins.deepSeq r/5175
This is done via a new `deepForce` function on Value. Since values can be cyclical (for example, see the test-case), we need to do some extra work to avoid RefCell borrow errors if we ever hit a graph cycle: While deep-forcing values, we keep a set of thunks that we have already seen and avoid doing any work on the same thunk twice. The set is encapsulated in a separate type to stop potentially invalid pointers from leaking out. Finally, since deep_force is conceptually similar to `VM::force_for_output` (but more suited to usage in eval since it doesn't clone the values) this removes the latter, replacing it with the former. Co-Authored-By: Vincent Ambo <tazjin@tvl.su> Change-Id: Iefddefcf09fae3b6a4d161a5873febcff54b9157 Reviewed-on: https://cl.tvl.fyi/c/depot/+/7000 Tested-by: BuildkiteCI Reviewed-by: grfn <grfn@gws.fyi> Reviewed-by: tazjin <tazjin@tvl.su>
Diffstat (limited to 'tvix/eval/src/value/list.rs')
-rw-r--r-- | tvix/eval/src/value/list.rs | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/tvix/eval/src/value/list.rs b/tvix/eval/src/value/list.rs index 3be5d414572c..42d91b6b26b2 100644 --- a/tvix/eval/src/value/list.rs +++ b/tvix/eval/src/value/list.rs @@ -102,3 +102,13 @@ impl IntoIterator for NixList { self.0.into_iter() } } + +impl<'a> IntoIterator for &'a NixList { + type Item = &'a Value; + + type IntoIter = std::slice::Iter<'a, Value>; + + fn into_iter(self) -> Self::IntoIter { + self.0.iter() + } +} |