diff options
Diffstat (limited to 'src/libexpr/attr-set.cc')
-rw-r--r-- | src/libexpr/attr-set.cc | 59 |
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()); +} + + +} |