aboutsummaryrefslogtreecommitdiff
path: root/src/libexpr/attr-set.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/libexpr/attr-set.cc')
-rw-r--r--src/libexpr/attr-set.cc40
1 files changed, 27 insertions, 13 deletions
diff --git a/src/libexpr/attr-set.cc b/src/libexpr/attr-set.cc
index b6091c955..52ac47e9b 100644
--- a/src/libexpr/attr-set.cc
+++ b/src/libexpr/attr-set.cc
@@ -7,26 +7,19 @@
namespace nix {
+
/* Allocate a new array of attributes for an attribute set with a specific
capacity. The space is implicitly reserved after the Bindings
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);
-}
-
-
-void EvalState::mkAttrs(Value & v, size_t capacity)
-{
- if (capacity == 0) {
- v = vEmptySet;
- return;
- }
- v.mkAttrs(allocBindings(capacity));
nrAttrsets++;
nrAttrsInAttrsets += capacity;
+ return new (allocBytes(sizeof(Bindings) + sizeof(Attr) * capacity)) Bindings((Bindings::size_t) capacity);
}
@@ -41,15 +34,36 @@ Value * EvalState::allocAttr(Value & vAttrs, const Symbol & name)
}
-Value * EvalState::allocAttr(Value & vAttrs, const std::string & name)
+Value * EvalState::allocAttr(Value & vAttrs, std::string_view name)
{
return allocAttr(vAttrs, symbols.create(name));
}
+Value & BindingsBuilder::alloc(const Symbol & name, ptr<Pos> pos)
+{
+ auto value = state.allocValue();
+ bindings->push_back(Attr(name, value, pos));
+ return *value;
+}
+
+
+Value & BindingsBuilder::alloc(std::string_view name, ptr<Pos> pos)
+{
+ return alloc(state.symbols.create(name), pos);
+}
+
+
void Bindings::sort()
{
- std::sort(begin(), end());
+ if (size_) std::sort(begin(), end());
+}
+
+
+Value & Value::mkAttrs(BindingsBuilder & bindings)
+{
+ mkAttrs(bindings.finish());
+ return *this;
}