about summary refs log tree commit diff
diff options
context:
space:
mode:
authorVincent Ambo <tazjin@google.com>2020-05-23T04·07+0100
committerVincent Ambo <tazjin@google.com>2020-05-23T05·18+0100
commit85a05a6f38b997082b4a88d7b80dfa1c1c35a88d (patch)
tree578e938b747d32e15efba1894a9a90457015360a
parentda4ca4e02f59d8d69f9996bd8de2f20f72d1d5ff (diff)
fix(3p/nix/libexpr): Remove the global empty attribute set r/821
In the change to the backing structure of attribute sets, the
requirement to manually balance the capacity of the structure went
away.

This is a) because Abseil's data structures manage this on their own,
and b) because the new Bindings class is allocated using `new (GC)`
rather than writing into a predefined memory area.

As part of this change functions related to the capacity were
deprecated and set to 0 values, which in turn caused the creation of
new attribute sets to return the same (mutable!) default value in
various cases, leading to "side effects" that caused evaluation
failures.

FWIW, I'm not sure if this optimisation had noticeable performance
impact, but while untangling libexpr it definitely doesn't help trying
to follow what it's doing - so bye, bye!
-rw-r--r--third_party/nix/src/libexpr/attr-set.cc4
-rw-r--r--third_party/nix/src/libexpr/eval.cc4
-rw-r--r--third_party/nix/src/libexpr/eval.hh2
3 files changed, 0 insertions, 10 deletions
diff --git a/third_party/nix/src/libexpr/attr-set.cc b/third_party/nix/src/libexpr/attr-set.cc
index 0e4cf5d9dc..495f9816c7 100644
--- a/third_party/nix/src/libexpr/attr-set.cc
+++ b/third_party/nix/src/libexpr/attr-set.cc
@@ -71,10 +71,6 @@ void Bindings::merge(Bindings* other) {
 Bindings* Bindings::NewGC() { return new (GC) Bindings; }
 
 void EvalState::mkAttrs(Value& v, size_t capacity) {
-  if (capacity == 0) {
-    v = vEmptySet;
-    return;
-  }
   clearValue(v);
   v.type = tAttrs;
   v.attrs = Bindings::NewGC();
diff --git a/third_party/nix/src/libexpr/eval.cc b/third_party/nix/src/libexpr/eval.cc
index b406854f4e..fc1824db8e 100644
--- a/third_party/nix/src/libexpr/eval.cc
+++ b/third_party/nix/src/libexpr/eval.cc
@@ -361,10 +361,6 @@ EvalState::EvalState(const Strings& _searchPath, const ref<Store>& store)
     }
   }
 
-  clearValue(vEmptySet);
-  vEmptySet.type = tAttrs;
-  vEmptySet.attrs = Bindings::NewGC();
-
   createBaseEnv();
 }
 
diff --git a/third_party/nix/src/libexpr/eval.hh b/third_party/nix/src/libexpr/eval.hh
index 03dd275edc..531294c93c 100644
--- a/third_party/nix/src/libexpr/eval.hh
+++ b/third_party/nix/src/libexpr/eval.hh
@@ -75,8 +75,6 @@ class EvalState {
      mode. */
   std::optional<PathSet> allowedPaths;
 
-  Value vEmptySet;
-
   const ref<Store> store;
 
  private: