refactor(3p/nix/libexpr): Back Nix lists with std::vector
This change does away with the previous special-casing of lists of certain element sizes, and the use of raw C-style arrays. Lists are now backed by a std::vector of nix::Value*, which uses the traceable GC allocator. This change is unfortunately quite noisy because the accessor methods were updated/removed accordingly, so all callsites of Nix-related lists have changed. For some operations in primops.cc where keeping the previous code structure would have been more difficult with a "proper" vector, the implementation has been replaced with std::vector methods. For example, list concatenation now uses appropriate range inserts. Anecdotally the performance of this is about equal, to even slightly better, than the previous implementation. All language tests pass and the depot paths I've used for testing still evaluate. Change-Id: Ib5eca6c0207429cb323a330c838c3a2200b2c693 Reviewed-on: https://cl.tvl.fyi/c/depot/+/1266 Tested-by: BuildkiteCI Reviewed-by: isomer <isomer@tvl.fyi> Reviewed-by: Kane York <rikingcoding@gmail.com> Reviewed-by: glittershark <grfn@gws.fyi>
This commit is contained in:
parent
56614c75e4
commit
cdc1a0bb6e
16 changed files with 163 additions and 231 deletions
20
third_party/nix/src/libexpr/get-drvs.cc
vendored
20
third_party/nix/src/libexpr/get-drvs.cc
vendored
|
|
@ -99,8 +99,8 @@ DrvInfo::Outputs DrvInfo::queryOutputs(bool onlyOutputsToInstall) {
|
|||
/* For each output... */
|
||||
for (unsigned int j = 0; j < i->second.value->listSize(); ++j) {
|
||||
/* Evaluate the corresponding set. */
|
||||
std::string name = state->forceStringNoCtx(
|
||||
*i->second.value->listElems()[j], *i->second.pos);
|
||||
std::string name = state->forceStringNoCtx(*(*i->second.value->list)[j],
|
||||
*i->second.pos);
|
||||
Bindings::iterator out = attrs->find(state->symbols.Create(name));
|
||||
if (out == attrs->end()) {
|
||||
continue; // FIXME: throw error?
|
||||
|
|
@ -136,12 +136,12 @@ DrvInfo::Outputs DrvInfo::queryOutputs(bool onlyOutputsToInstall) {
|
|||
throw errMsg;
|
||||
}
|
||||
Outputs result;
|
||||
for (auto i = outTI->listElems(); i != outTI->listElems() + outTI->listSize();
|
||||
++i) {
|
||||
if ((*i)->type != tString) {
|
||||
|
||||
for (Value* i : *outTI->list) {
|
||||
if (i->type != tString) {
|
||||
throw errMsg;
|
||||
}
|
||||
auto out = outputs.find((*i)->string.s);
|
||||
auto out = outputs.find(i->string.s);
|
||||
if (out == outputs.end()) {
|
||||
throw errMsg;
|
||||
}
|
||||
|
|
@ -190,7 +190,7 @@ bool DrvInfo::checkMeta(Value& v) {
|
|||
state->forceValue(v);
|
||||
if (v.isList()) {
|
||||
for (unsigned int n = 0; n < v.listSize(); ++n) {
|
||||
if (!checkMeta(*v.listElems()[n])) {
|
||||
if (!checkMeta(*(*v.list)[n])) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
@ -418,10 +418,10 @@ static void getDerivations(EvalState& state, Value& vIn,
|
|||
for (unsigned int n = 0; n < v.listSize(); ++n) {
|
||||
std::string pathPrefix2 =
|
||||
addToPath(pathPrefix, (format("%1%") % n).str());
|
||||
if (getDerivation(state, *v.listElems()[n], pathPrefix2, drvs, done,
|
||||
if (getDerivation(state, *(*v.list)[n], pathPrefix2, drvs, done,
|
||||
ignoreAssertionFailures)) {
|
||||
getDerivations(state, *v.listElems()[n], pathPrefix2, autoArgs, drvs,
|
||||
done, ignoreAssertionFailures);
|
||||
getDerivations(state, *(*v.list)[n], pathPrefix2, autoArgs, drvs, done,
|
||||
ignoreAssertionFailures);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue