aboutsummaryrefslogtreecommitdiff
path: root/src/libexpr
diff options
context:
space:
mode:
authorEelco Dolstra <edolstra@gmail.com>2022-01-04 19:23:11 +0100
committerEelco Dolstra <edolstra@gmail.com>2022-01-04 19:23:11 +0100
commit17daec0b832205df781f6443292667c9aa617047 (patch)
tree43f60d7ce1a0e24edb7897e26dd60ef14c93fa46 /src/libexpr
parentca5baf239277daecef489a415fe157094bd7e799 (diff)
Move empty attrset optimisation
Diffstat (limited to 'src/libexpr')
-rw-r--r--src/libexpr/attr-set.cc8
-rw-r--r--src/libexpr/eval.cc3
-rw-r--r--src/libexpr/eval.hh2
3 files changed, 5 insertions, 8 deletions
diff --git a/src/libexpr/attr-set.cc b/src/libexpr/attr-set.cc
index d74243f45..fc971957d 100644
--- a/src/libexpr/attr-set.cc
+++ b/src/libexpr/attr-set.cc
@@ -12,6 +12,8 @@ namespace nix {
structure. */
Bindings * EvalState::allocBindings(size_t capacity)
{
+ if (capacity == 0)
+ return &emptyBindings;
if (capacity > std::numeric_limits<Bindings::size_t>::max())
throw Error("attribute set of size %d is too big", capacity);
return new (allocBytes(sizeof(Bindings) + sizeof(Attr) * capacity)) Bindings((Bindings::size_t) capacity);
@@ -20,10 +22,6 @@ Bindings * EvalState::allocBindings(size_t capacity)
void EvalState::mkAttrs(Value & v, size_t capacity)
{
- if (capacity == 0) {
- v = vEmptySet;
- return;
- }
v.mkAttrs(allocBindings(capacity));
nrAttrsets++;
nrAttrsInAttrsets += capacity;
@@ -63,7 +61,7 @@ Value & BindingsBuilder::alloc(std::string_view name, ptr<Pos> pos)
void Bindings::sort()
{
- std::sort(begin(), end());
+ if (size_) std::sort(begin(), end());
}
diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc
index cd7d19747..112690189 100644
--- a/src/libexpr/eval.cc
+++ b/src/libexpr/eval.cc
@@ -413,6 +413,7 @@ EvalState::EvalState(
, sSelf(symbols.create("self"))
, sEpsilon(symbols.create(""))
, repair(NoRepair)
+ , emptyBindings(0)
, store(store)
, buildStore(buildStore ? buildStore : store)
, regexCache(makeRegexCache())
@@ -454,8 +455,6 @@ EvalState::EvalState(
}
}
- vEmptySet.mkAttrs(allocBindings(0));
-
createBaseEnv();
}
diff --git a/src/libexpr/eval.hh b/src/libexpr/eval.hh
index c7f74d7b7..c0d88201a 100644
--- a/src/libexpr/eval.hh
+++ b/src/libexpr/eval.hh
@@ -91,7 +91,7 @@ public:
mode. */
std::optional<PathSet> allowedPaths;
- Value vEmptySet;
+ Bindings emptyBindings;
/* Store used to materialise .drv files. */
const ref<Store> store;