Merge branch 'attr-set-hh' of https://github.com/nbp/nix
Conflicts: src/libexpr/eval.cc
This commit is contained in:
commit
19eddecc0f
4 changed files with 142 additions and 94 deletions
59
src/libexpr/attr-set.cc
Normal file
59
src/libexpr/attr-set.cc
Normal file
|
@ -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());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
82
src/libexpr/attr-set.hh
Normal file
82
src/libexpr/attr-set.hh
Normal file
|
@ -0,0 +1,82 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "nixexpr.hh"
|
||||||
|
#include "symbol-table.hh"
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
|
namespace nix {
|
||||||
|
|
||||||
|
|
||||||
|
class EvalState;
|
||||||
|
struct Value;
|
||||||
|
|
||||||
|
/* Map one attribute name to its value. */
|
||||||
|
struct Attr
|
||||||
|
{
|
||||||
|
Symbol name;
|
||||||
|
Value * value;
|
||||||
|
Pos * pos;
|
||||||
|
Attr(Symbol name, Value * value, Pos * pos = &noPos)
|
||||||
|
: name(name), value(value), pos(pos) { };
|
||||||
|
Attr() : pos(&noPos) { };
|
||||||
|
bool operator < (const Attr & a) const
|
||||||
|
{
|
||||||
|
return name < a.name;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Bindings contains all the attributes of an attribute set. It is defined
|
||||||
|
by its size and its capacity, the capacity being the number of Attr
|
||||||
|
elements allocated after this structure, while the size corresponds to
|
||||||
|
the number of elements already inserted in this structure. */
|
||||||
|
class Bindings
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
typedef uint32_t size_t;
|
||||||
|
|
||||||
|
private:
|
||||||
|
size_t size_, capacity_;
|
||||||
|
Attr attrs[0];
|
||||||
|
|
||||||
|
Bindings(size_t capacity) : size_(0), capacity_(capacity) { }
|
||||||
|
Bindings(const Bindings & bindings) = delete;
|
||||||
|
|
||||||
|
public:
|
||||||
|
size_t size() const { return size_; }
|
||||||
|
|
||||||
|
bool empty() const { return !size_; }
|
||||||
|
|
||||||
|
typedef Attr * iterator;
|
||||||
|
|
||||||
|
void push_back(const Attr & attr)
|
||||||
|
{
|
||||||
|
assert(size_ < capacity_);
|
||||||
|
attrs[size_++] = attr;
|
||||||
|
}
|
||||||
|
|
||||||
|
iterator find(const Symbol & name)
|
||||||
|
{
|
||||||
|
Attr key(name, 0);
|
||||||
|
iterator i = std::lower_bound(begin(), end(), key);
|
||||||
|
if (i != end() && i->name == name) return i;
|
||||||
|
return end();
|
||||||
|
}
|
||||||
|
|
||||||
|
iterator begin() { return &attrs[0]; }
|
||||||
|
iterator end() { return &attrs[size_]; }
|
||||||
|
|
||||||
|
Attr & operator[](size_t pos)
|
||||||
|
{
|
||||||
|
return attrs[pos];
|
||||||
|
}
|
||||||
|
|
||||||
|
void sort();
|
||||||
|
|
||||||
|
size_t capacity() { return capacity_; }
|
||||||
|
|
||||||
|
friend class EvalState;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -55,12 +55,6 @@ static void * allocBytes(size_t n)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Bindings::sort()
|
|
||||||
{
|
|
||||||
std::sort(begin(), end());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void printValue(std::ostream & str, std::set<const Value *> & active, const Value & v)
|
static void printValue(std::ostream & str, std::set<const Value *> & active, const Value & v)
|
||||||
{
|
{
|
||||||
checkInterrupt();
|
checkInterrupt();
|
||||||
|
@ -507,20 +501,6 @@ Env & EvalState::allocEnv(unsigned int size)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Value * EvalState::allocAttr(Value & vAttrs, const Symbol & name)
|
|
||||||
{
|
|
||||||
Value * v = allocValue();
|
|
||||||
vAttrs.attrs->push_back(Attr(name, v));
|
|
||||||
return v;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Bindings * EvalState::allocBindings(Bindings::size_t capacity)
|
|
||||||
{
|
|
||||||
return new (allocBytes(sizeof(Bindings) + sizeof(Attr) * capacity)) Bindings(capacity);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void EvalState::mkList(Value & v, unsigned int size)
|
void EvalState::mkList(Value & v, unsigned int size)
|
||||||
{
|
{
|
||||||
clearValue(v);
|
clearValue(v);
|
||||||
|
@ -537,16 +517,6 @@ void EvalState::mkList(Value & v, unsigned int size)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void EvalState::mkAttrs(Value & v, unsigned int expected)
|
|
||||||
{
|
|
||||||
clearValue(v);
|
|
||||||
v.type = tAttrs;
|
|
||||||
v.attrs = allocBindings(expected);
|
|
||||||
nrAttrsets++;
|
|
||||||
nrAttrsInAttrsets += expected;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
unsigned long nrThunks = 0;
|
unsigned long nrThunks = 0;
|
||||||
|
|
||||||
static inline void mkThunk(Value & v, Env & env, Expr * expr)
|
static inline void mkThunk(Value & v, Env & env, Expr * expr)
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include "attr-set.hh"
|
||||||
#include "value.hh"
|
#include "value.hh"
|
||||||
#include "nixexpr.hh"
|
#include "nixexpr.hh"
|
||||||
#include "symbol-table.hh"
|
#include "symbol-table.hh"
|
||||||
|
@ -18,70 +19,6 @@ namespace nix {
|
||||||
class EvalState;
|
class EvalState;
|
||||||
|
|
||||||
|
|
||||||
struct Attr
|
|
||||||
{
|
|
||||||
Symbol name;
|
|
||||||
Value * value;
|
|
||||||
Pos * pos;
|
|
||||||
Attr(Symbol name, Value * value, Pos * pos = &noPos)
|
|
||||||
: name(name), value(value), pos(pos) { };
|
|
||||||
Attr() : pos(&noPos) { };
|
|
||||||
bool operator < (const Attr & a) const
|
|
||||||
{
|
|
||||||
return name < a.name;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
class Bindings
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
typedef uint32_t size_t;
|
|
||||||
|
|
||||||
private:
|
|
||||||
size_t size_, capacity_;
|
|
||||||
Attr attrs[0];
|
|
||||||
|
|
||||||
Bindings(size_t capacity) : size_(0), capacity_(capacity) { }
|
|
||||||
Bindings(const Bindings & bindings) = delete;
|
|
||||||
|
|
||||||
public:
|
|
||||||
size_t size() const { return size_; }
|
|
||||||
|
|
||||||
bool empty() const { return !size_; }
|
|
||||||
|
|
||||||
typedef Attr * iterator;
|
|
||||||
|
|
||||||
void push_back(const Attr & attr)
|
|
||||||
{
|
|
||||||
assert(size_ < capacity_);
|
|
||||||
attrs[size_++] = attr;
|
|
||||||
}
|
|
||||||
|
|
||||||
iterator find(const Symbol & name)
|
|
||||||
{
|
|
||||||
Attr key(name, 0);
|
|
||||||
iterator i = std::lower_bound(begin(), end(), key);
|
|
||||||
if (i != end() && i->name == name) return i;
|
|
||||||
return end();
|
|
||||||
}
|
|
||||||
|
|
||||||
iterator begin() { return &attrs[0]; }
|
|
||||||
iterator end() { return &attrs[size_]; }
|
|
||||||
|
|
||||||
Attr & operator[](size_t pos)
|
|
||||||
{
|
|
||||||
return attrs[pos];
|
|
||||||
}
|
|
||||||
|
|
||||||
void sort();
|
|
||||||
|
|
||||||
size_t capacity() { return capacity_; }
|
|
||||||
|
|
||||||
friend class EvalState;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
typedef void (* PrimOpFun) (EvalState & state, const Pos & pos, Value * * args, Value & v);
|
typedef void (* PrimOpFun) (EvalState & state, const Pos & pos, Value * * args, Value & v);
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue