functionArgs: Allocate bools only once

This commit is contained in:
Robert Hensing 2024-03-20 23:11:54 +01:00
parent 8c6e0df45f
commit 1fcdd1640e
3 changed files with 9 additions and 2 deletions

View File

@ -937,6 +937,9 @@ ListBuilder::ListBuilder(EvalState & state, size_t size)
state.nrListElems += size;
}
Value * EvalState::getBool(bool b) {
return b ? &vTrue : &vFalse;
}
unsigned long nrThunks = 0;

View File

@ -650,6 +650,11 @@ public:
return ListBuilder(*this, size);
}
/**
* Return a boolean `Value *` without allocating.
*/
Value *getBool(bool b);
void mkThunk_(Value & v, Expr * expr);
void mkPos(Value & v, PosIdx pos);

View File

@ -2845,8 +2845,7 @@ static void prim_functionArgs(EvalState & state, const PosIdx pos, Value * * arg
auto attrs = state.buildBindings(args[0]->lambda.fun->formals->formals.size());
for (auto & i : args[0]->lambda.fun->formals->formals)
// !!! should optimise booleans (allocate only once)
attrs.alloc(i.name, i.pos).mkBool(i.def);
attrs.insert(i.name, state.getBool(i.def), i.pos);
v.mkAttrs(attrs);
}