1
0
Fork 0
mirror of https://github.com/NixOS/nix synced 2025-06-25 10:41:16 +02:00

Merge pull request #13233 from xokdvium/function-args-opt

libexpr: Use `attrs.alreadySorted()` in primop_functionArgs
This commit is contained in:
Jörg Thalheim 2025-05-20 08:29:42 +02:00 committed by GitHub
commit 6867a4688a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 12 additions and 3 deletions

View file

@ -306,6 +306,9 @@ struct Formal
struct Formals struct Formals
{ {
typedef std::vector<Formal> Formals_; typedef std::vector<Formal> Formals_;
/**
* @pre Sorted according to predicate (std::tie(a.name, a.pos) < std::tie(b.name, b.pos)).
*/
Formals_ formals; Formals_ formals;
bool ellipsis; bool ellipsis;

View file

@ -3148,10 +3148,16 @@ static void prim_functionArgs(EvalState & state, const PosIdx pos, Value * * arg
return; return;
} }
auto attrs = state.buildBindings(args[0]->payload.lambda.fun->formals->formals.size()); const auto &formals = args[0]->payload.lambda.fun->formals->formals;
for (auto & i : args[0]->payload.lambda.fun->formals->formals) auto attrs = state.buildBindings(formals.size());
for (auto & i : formals)
attrs.insert(i.name, state.getBool(i.def), i.pos); attrs.insert(i.name, state.getBool(i.def), i.pos);
v.mkAttrs(attrs); /* Optimization: avoid sorting bindings. `formals` must already be sorted according to
(std::tie(a.name, a.pos) < std::tie(b.name, b.pos)) predicate, so the following assertion
always holds:
assert(std::is_sorted(attrs.alreadySorted()->begin(), attrs.alreadySorted()->end()));
.*/
v.mkAttrs(attrs.alreadySorted());
} }
static RegisterPrimOp primop_functionArgs({ static RegisterPrimOp primop_functionArgs({