prim_foldlStrict: call forceValue() before value is copied

forceValue() were called after a value is copied effectively forcing only one of the copies keeping another copy not evaluated.
This resulted in its evaluation of the same lazy value more than once (the number of hits is not big though)
This commit is contained in:
volth 2018-07-21 06:44:42 +00:00 committed by GitHub
parent 1b34b69b45
commit e2b114cfe1
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -1508,19 +1508,20 @@ static void prim_foldlStrict(EvalState & state, const Pos & pos, Value * * args,
state.forceFunction(*args[0], pos); state.forceFunction(*args[0], pos);
state.forceList(*args[2], pos); state.forceList(*args[2], pos);
if (args[2]->listSize()) {
Value * vCur = args[1]; Value * vCur = args[1];
if (args[2]->listSize())
for (unsigned int n = 0; n < args[2]->listSize(); ++n) { for (unsigned int n = 0; n < args[2]->listSize(); ++n) {
Value vTmp; Value vTmp;
state.callFunction(*args[0], *vCur, vTmp, pos); state.callFunction(*args[0], *vCur, vTmp, pos);
vCur = n == args[2]->listSize() - 1 ? &v : state.allocValue(); vCur = n == args[2]->listSize() - 1 ? &v : state.allocValue();
state.callFunction(vTmp, *args[2]->listElems()[n], *vCur, pos); state.callFunction(vTmp, *args[2]->listElems()[n], *vCur, pos);
} }
else
v = *vCur;
state.forceValue(v); state.forceValue(v);
} else {
state.forceValue(*args[1]);
v = *args[1];
}
} }