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…
	
	Add table
		Add a link
		
	
		Reference in a new issue