diff options
author | Eelco Dolstra <e.dolstra@tudelft.nl> | 2009-05-12T11·06+0000 |
---|---|---|
committer | Eelco Dolstra <e.dolstra@tudelft.nl> | 2009-05-12T11·06+0000 |
commit | 50d11b90caf6545556fc090858c694e19f3c7683 (patch) | |
tree | d02d64d1162c489ff52c225612f2e9d4600602bb | |
parent | c34e6d71bc62bb83f3bfed69f781ded4d5a46d3a (diff) |
* Allow unsafe (unspecified) comparisons between attrsets unless
NIX_NO_UNSAFE_EQ is set, for now.
-rw-r--r-- | src/libexpr/eval.cc | 8 | ||||
-rw-r--r-- | src/libexpr/eval.hh | 2 |
2 files changed, 9 insertions, 1 deletions
diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc index 2b9b96559d7d..cd9c64594747 100644 --- a/src/libexpr/eval.cc +++ b/src/libexpr/eval.cc @@ -23,6 +23,8 @@ EvalState::EvalState() initNixExprHelpers(); addPrimOps(); + + allowUnsafeEquality = getEnv("NIX_NO_UNSAFE_EQ", "") == ""; } @@ -661,9 +663,13 @@ LocalNoInline(bool areEqual(EvalState & state, Expr e1, Expr e2)) /* Functions are incomparable. */ if (sym1 == symFunction || sym1 == symPrimOp) return false; - if (sym1 == symAttrs) + if (!state.allowUnsafeEquality && sym1 == symAttrs) throw EvalError("comparison of attribute sets is not implemented"); + /* !!! This allows comparisons of infinite data structures to + succeed, such as `let x = [x]; in x == x'. This is + undesirable, since equivalent (?) terms such as `let x = [x]; y + = [y]; in x == y' don't terminate. */ if (e1 == e2) return true; if (sym1 == symList) { diff --git a/src/libexpr/eval.hh b/src/libexpr/eval.hh index 5699d455cc0d..fed6d347266b 100644 --- a/src/libexpr/eval.hh +++ b/src/libexpr/eval.hh @@ -38,6 +38,8 @@ struct EvalState unsigned int nrEvaluated; unsigned int nrCached; + bool allowUnsafeEquality; + EvalState(); void addPrimOps(); |