diff options
author | Eelco Dolstra <eelco.dolstra@logicblox.com> | 2015-07-23T20·16+0200 |
---|---|---|
committer | Eelco Dolstra <eelco.dolstra@logicblox.com> | 2015-07-23T20·16+0200 |
commit | 19eddecc0fc4e8c12063626eaf942642894a3580 (patch) | |
tree | 92c66426a79420fe0daefd6f2911c0e9d9d68a06 /src/libexpr/attr-set.cc | |
parent | b83801f8b3b48f4d69414401c8a51724946a8666 (diff) | |
parent | db21cfa68820ed06f176aaf54e0ee5ce023951f7 (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.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()); +} + + +} |