From 9ada456260c0fff256f08a6aa87c436a0027f318 Mon Sep 17 00:00:00 2001 From: Adam Joseph Date: Mon, 31 Oct 2022 03:35:28 -0700 Subject: fix(tvix/eval): nix_eq() must recurse The current implementation of nix_eq will force one level of thunks and then switch to the (non-forcing) rust Eq::eq() method. This gives incorrect results for lists-of-thunks. This commit changes nix_eq() to be recursive. A regression test (which fails prior to this commit) is included. This fix also causes nix_tests/eval-okay-fromjson.nix to pass, so it is moved out of notyetpassing. Change-Id: I655fd7a5294208a7b39df8e2c3c12a8b9768292f Signed-off-by: Adam Joseph Reviewed-on: https://cl.tvl.fyi/c/depot/+/7142 Tested-by: BuildkiteCI Reviewed-by: tazjin --- tvix/eval/src/value/mod.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'tvix/eval/src/value/mod.rs') diff --git a/tvix/eval/src/value/mod.rs b/tvix/eval/src/value/mod.rs index c590495b53..ff9dccb0b3 100644 --- a/tvix/eval/src/value/mod.rs +++ b/tvix/eval/src/value/mod.rs @@ -332,15 +332,15 @@ impl Value { lhs.force(vm)?; rhs.force(vm)?; - Ok(*lhs.value() == *rhs.value()) + lhs.value().nix_eq(&*rhs.value(), vm) } (Value::Thunk(lhs), rhs) => { lhs.force(vm)?; - Ok(&*lhs.value() == rhs) + lhs.value().nix_eq(rhs, vm) } (lhs, Value::Thunk(rhs)) => { rhs.force(vm)?; - Ok(lhs == &*rhs.value()) + lhs.nix_eq(&*rhs.value(), vm) } // Everything else is either incomparable (e.g. internal -- cgit 1.4.1