Move empty attrset optimisation

This commit is contained in:
Eelco Dolstra 2022-01-04 19:23:11 +01:00
parent ca5baf2392
commit 17daec0b83
3 changed files with 5 additions and 8 deletions

View file

@ -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());
}

View file

@ -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();
}

View file

@ -91,7 +91,7 @@ public:
mode. */
std::optional<PathSet> allowedPaths;
Value vEmptySet;
Bindings emptyBindings;
/* Store used to materialise .drv files. */
const ref<Store> store;