about summary refs log tree commit diff
path: root/src/libexpr/attr-set.cc
diff options
context:
space:
mode:
authorEelco Dolstra <eelco.dolstra@logicblox.com>2015-07-23T20·16+0200
committerEelco Dolstra <eelco.dolstra@logicblox.com>2015-07-23T20·16+0200
commit19eddecc0fc4e8c12063626eaf942642894a3580 (patch)
tree92c66426a79420fe0daefd6f2911c0e9d9d68a06 /src/libexpr/attr-set.cc
parentb83801f8b3b48f4d69414401c8a51724946a8666 (diff)
parentdb21cfa68820ed06f176aaf54e0ee5ce023951f7 (diff)
Merge branch 'attr-set-hh' of https://github.com/nbp/nix
Conflicts:
	src/libexpr/eval.cc
Diffstat (limited to 'src/libexpr/attr-set.cc')
-rw-r--r--src/libexpr/attr-set.cc59
1 files changed, 59 insertions, 0 deletions
diff --git a/src/libexpr/attr-set.cc b/src/libexpr/attr-set.cc
new file mode 100644
index 000000000000..9ac5e603199a
--- /dev/null
+++ b/src/libexpr/attr-set.cc
@@ -0,0 +1,59 @@
+#include "attr-set.hh"
+#include "eval.hh"
+
+#include <algorithm>
+
+
+namespace nix {
+
+
+static void * allocBytes(size_t n)
+{
+    void * p;
+#if HAVE_BOEHMGC
+    p = GC_malloc(n);
+#else
+    p = malloc(n);
+#endif
+    if (!p) throw std::bad_alloc();
+    return p;
+}
+
+
+/* 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(Bindings::size_t capacity)
+{
+    return new (allocBytes(sizeof(Bindings) + sizeof(Attr) * capacity)) Bindings(capacity);
+}
+
+
+void EvalState::mkAttrs(Value & v, unsigned int expected)
+{
+    clearValue(v);
+    v.type = tAttrs;
+    v.attrs = allocBindings(expected);
+    nrAttrsets++;
+    nrAttrsInAttrsets += expected;
+}
+
+
+/* Create a new attribute named 'name' on an existing attribute set stored
+   in 'vAttrs' and return the newly allocated Value which is associated with
+   this attribute. */
+Value * EvalState::allocAttr(Value & vAttrs, const Symbol & name)
+{
+    Value * v = allocValue();
+    vAttrs.attrs->push_back(Attr(name, v));
+    return v;
+}
+
+
+void Bindings::sort()
+{
+    std::sort(begin(), end());
+}
+
+
+}