aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorvolth <volth@webmaster.ms>2018-07-21 06:44:42 +0000
committerGitHub <noreply@github.com>2018-07-21 06:44:42 +0000
commite2b114cfe19c28bfd9fe95e1aa97aa154b904002 (patch)
treefd4d6364409394f8df1cd42a39cfb3cd4b9e76e7
parent1b34b69b45106e5bfdbdc0201d3ff4dcd36632f0 (diff)
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)
-rw-r--r--src/libexpr/primops.cc13
1 files changed, 7 insertions, 6 deletions
diff --git a/src/libexpr/primops.cc b/src/libexpr/primops.cc
index e71e3a6d4..311a32b0b 100644
--- a/src/libexpr/primops.cc
+++ b/src/libexpr/primops.cc
@@ -1508,19 +1508,20 @@ static void prim_foldlStrict(EvalState & state, const Pos & pos, Value * * args,
state.forceFunction(*args[0], pos);
state.forceList(*args[2], pos);
- Value * vCur = args[1];
+ if (args[2]->listSize()) {
+ Value * vCur = args[1];
- if (args[2]->listSize())
for (unsigned int n = 0; n < args[2]->listSize(); ++n) {
Value vTmp;
state.callFunction(*args[0], *vCur, vTmp, pos);
vCur = n == args[2]->listSize() - 1 ? &v : state.allocValue();
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];
+ }
}