forked from lix-project/lix
a385e51a08
after #6218 `Symbol` no longer confers a uniqueness invariant on the string it wraps, it is now possible to create multiple symbols that compare equal but whose string contents have different addresses. this guarantee is now only provided by `SymbolIdx`, leaving `Symbol` only as a string wrapper that knows about the intricacies of how symbols need to be formatted for output. this change renames `SymbolIdx` to `Symbol` to restore the previous semantics of `Symbol` to that name. we also keep the wrapper type and rename it to `SymbolStr` instead of returning plain strings from lookups into the symbol table because symbols are formatted for output in many places. theoretically we do not need `SymbolStr`, only a function that formats a string for output as a symbol, but having to wrap every symbol that appears in a message into eg `formatSymbol()` is error-prone and inconvient.
71 lines
1.6 KiB
C++
71 lines
1.6 KiB
C++
#include "attr-set.hh"
|
|
#include "eval-inline.hh"
|
|
|
|
#include <algorithm>
|
|
|
|
|
|
namespace nix {
|
|
|
|
|
|
|
|
/* 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(size_t capacity)
|
|
{
|
|
if (capacity == 0)
|
|
return &emptyBindings;
|
|
if (capacity > std::numeric_limits<Bindings::size_t>::max())
|
|
throw Error("attribute set of size %d is too big", capacity);
|
|
nrAttrsets++;
|
|
nrAttrsInAttrsets += capacity;
|
|
return new (allocBytes(sizeof(Bindings) + sizeof(Attr) * capacity)) Bindings((Bindings::size_t) capacity);
|
|
}
|
|
|
|
|
|
/* 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;
|
|
}
|
|
|
|
|
|
Value * EvalState::allocAttr(Value & vAttrs, std::string_view name)
|
|
{
|
|
return allocAttr(vAttrs, symbols.create(name));
|
|
}
|
|
|
|
|
|
Value & BindingsBuilder::alloc(const Symbol & name, PosIdx pos)
|
|
{
|
|
auto value = state.allocValue();
|
|
bindings->push_back(Attr(name, value, pos));
|
|
return *value;
|
|
}
|
|
|
|
|
|
Value & BindingsBuilder::alloc(std::string_view name, PosIdx pos)
|
|
{
|
|
return alloc(state.symbols.create(name), pos);
|
|
}
|
|
|
|
|
|
void Bindings::sort()
|
|
{
|
|
if (size_) std::sort(begin(), end());
|
|
}
|
|
|
|
|
|
Value & Value::mkAttrs(BindingsBuilder & bindings)
|
|
{
|
|
mkAttrs(bindings.finish());
|
|
return *this;
|
|
}
|
|
|
|
|
|
}
|