diff options
author | Vincent Ambo <mail@tazj.in> | 2022-10-22T13·51+0300 |
---|---|---|
committer | tazjin <tazjin@tvl.su> | 2022-10-23T15·50+0000 |
commit | 60f24c3c53eae116bb3051f02f05b74a8ecf37af (patch) | |
tree | 794d987b22303cfbbb1dd8d251e81ab15d67ad68 /tvix/eval/src/value/list.rs | |
parent | 4ff06ba67dbe5397a97c2bae78e25d0ab8c026a3 (diff) |
fix(tvix/eval): detect cycles when printing infinite values r/5178
Using the same method as in Thunk::deep_force, detect cycles when printing values by maintaining a set of already seen thunks. With this, display of infinite values matches that of Nix: > nix-instantiate --eval --strict -E 'let as = { x = 123; y = as; }; in as' { x = 123; y = { x = 123; y = <CYCLE>; }; } > tvix-eval -E 'let as = { x = 123; y = as; }; in as' => { x = 123; y = { x = 123; y = <CYCLE>; }; } :: set Change-Id: I007b918d5131d82c28884e46e46ff365ef691aa8 Reviewed-on: https://cl.tvl.fyi/c/depot/+/7056 Tested-by: BuildkiteCI Reviewed-by: grfn <grfn@gws.fyi>
Diffstat (limited to 'tvix/eval/src/value/list.rs')
-rw-r--r-- | tvix/eval/src/value/list.rs | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/tvix/eval/src/value/list.rs b/tvix/eval/src/value/list.rs index 42d91b6b26b2..d13e220bbe64 100644 --- a/tvix/eval/src/value/list.rs +++ b/tvix/eval/src/value/list.rs @@ -1,21 +1,21 @@ //! This module implements Nix lists. -use std::fmt::Display; - use crate::errors::ErrorKind; use crate::vm::VM; +use super::thunk::ThunkSet; +use super::TotalDisplay; use super::Value; #[repr(transparent)] #[derive(Clone, Debug, PartialEq)] pub struct NixList(Vec<Value>); -impl Display for NixList { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { +impl TotalDisplay for NixList { + fn total_fmt(&self, f: &mut std::fmt::Formatter<'_>, set: &mut ThunkSet) -> std::fmt::Result { f.write_str("[ ")?; for v in &self.0 { - v.fmt(f)?; + v.total_fmt(f, set)?; f.write_str(" ")?; } |