diff options
Diffstat (limited to 'tvix/eval')
-rw-r--r-- | tvix/eval/src/chunk.rs | 10 | ||||
-rw-r--r-- | tvix/eval/src/value/thunk.rs | 16 |
2 files changed, 25 insertions, 1 deletions
diff --git a/tvix/eval/src/chunk.rs b/tvix/eval/src/chunk.rs index 35fd7e78e674..04b58bde20fd 100644 --- a/tvix/eval/src/chunk.rs +++ b/tvix/eval/src/chunk.rs @@ -143,7 +143,15 @@ impl Chunk { } match self[idx] { - OpCode::OpConstant(idx) => writeln!(writer, "OpConstant({}@{})", self[idx], idx.0), + OpCode::OpConstant(idx) => { + let val_str = match &self[idx] { + Value::Thunk(t) => t.debug_repr(), + Value::Closure(c) => format!("closure({:p})", c.lambda), + val => format!("{}", val), + }; + + writeln!(writer, "OpConstant({}@{})", val_str, idx.0) + } op => writeln!(writer, "{:?}", op), }?; diff --git a/tvix/eval/src/value/thunk.rs b/tvix/eval/src/value/thunk.rs index e30d58e72849..747cd413e23e 100644 --- a/tvix/eval/src/value/thunk.rs +++ b/tvix/eval/src/value/thunk.rs @@ -73,6 +73,17 @@ enum ThunkRepr { Evaluated(Value), } +impl ThunkRepr { + fn debug_repr(&self) -> String { + match self { + ThunkRepr::Evaluated(v) => format!("thunk(val|{})", v), + ThunkRepr::Blackhole => "thunk(blackhole)".to_string(), + ThunkRepr::Native(_) => "thunk(native)".to_string(), + ThunkRepr::Suspended { lambda, .. } => format!("thunk({:p})", *lambda), + } + } +} + /// A thunk is created for any value which requires non-strict /// evaluation due to self-reference or lazy semantics (or both). /// Every reference cycle involving `Value`s will contain at least @@ -428,6 +439,11 @@ impl Thunk { _ => false, } } + + /// Helper function to format thunks in observer output. + pub(crate) fn debug_repr(&self) -> String { + self.0.borrow().debug_repr() + } } impl TotalDisplay for Thunk { |