primops: Err on the side of less stack usage

Try to stay away from stack overflows.

These small vectors use stack space. Most instances will not need
to allocate because in general most things are small, and large
things are worth heap allocating.

16 * 3 * word = 384 bytes is still quite a bit, but these functions
tend not to be part of deep recursions.
This commit is contained in:
Robert Hensing 2023-11-16 12:48:37 +01:00
parent 91114a6fa4
commit 898c47384f
2 changed files with 3 additions and 3 deletions

View file

@ -2015,7 +2015,7 @@ void ExprConcatStrings::eval(EvalState & state, Env & env, Value & v)
return result; return result;
}; };
boost::container::small_vector<Value, 64> values(es->size()); boost::container::small_vector<Value, 16> values(es->size());
Value * vTmpP = values.data(); Value * vTmpP = values.data();
for (auto & [i_pos, i] : *es) { for (auto & [i_pos, i] : *es) {

View file

@ -2549,7 +2549,7 @@ static void prim_removeAttrs(EvalState & state, const PosIdx pos, Value * * args
/* Get the attribute names to be removed. /* Get the attribute names to be removed.
We keep them as Attrs instead of Symbols so std::set_difference We keep them as Attrs instead of Symbols so std::set_difference
can be used to remove them from attrs[0]. */ can be used to remove them from attrs[0]. */
boost::container::small_vector<Attr, 64> names; boost::container::small_vector<Attr, 16> names;
names.reserve(args[1]->listSize()); names.reserve(args[1]->listSize());
for (auto elem : args[1]->listItems()) { for (auto elem : args[1]->listItems()) {
state.forceStringNoCtx(*elem, pos, "while evaluating the values of the second argument passed to builtins.removeAttrs"); state.forceStringNoCtx(*elem, pos, "while evaluating the values of the second argument passed to builtins.removeAttrs");
@ -3452,7 +3452,7 @@ static void prim_concatMap(EvalState & state, const PosIdx pos, Value * * args,
state.forceList(*args[1], pos, "while evaluating the second argument passed to builtins.concatMap"); state.forceList(*args[1], pos, "while evaluating the second argument passed to builtins.concatMap");
auto nrLists = args[1]->listSize(); auto nrLists = args[1]->listSize();
boost::container::small_vector<Value, 64> lists(nrLists); boost::container::small_vector<Value, 16> lists(nrLists);
size_t len = 0; size_t len = 0;
for (unsigned int n = 0; n < nrLists; ++n) { for (unsigned int n = 0; n < nrLists; ++n) {