Commit 29957687 authored by Oswald Buddenhagen's avatar Oswald Buddenhagen
Browse files

execute some loops even in cumulative mode



we execute foreach loops now. this is (mostly) safe nowadays, because
a previous change added precautions against exponential value list
growth, so it's unlikely that two nested loops would keep the cpu busy
for a day as before.

we continue to exclude forever loops and loops with excessive integer
counts.

Task-number: QTCREATORBUG-6840
Change-Id: Iaa116086986cc7fd5023834753f791dd205102e5
Reviewed-by: default avatarDaniel Teske <daniel.teske@digia.com>
Reviewed-by: default avatarOswald Buddenhagen <oswald.buddenhagen@digia.com>
(cherry picked from qttools/dd4d594c787a62fa8aa12695c5d115c71b59bacd)
Reviewed-by: default avatarJoerg Bornemann <joerg.bornemann@digia.com>
parent fd9ed1b7
......@@ -575,13 +575,7 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::visitProBlock(
okey = true, or_op = false; // force next evaluation
break;
case TokForLoop:
if (m_cumulative) { // This is a no-win situation, so just pretend it's no loop
skipHashStr(tokPtr);
uint exprLen = getBlockLen(tokPtr);
tokPtr += exprLen;
blockLen = getBlockLen(tokPtr);
ret = visitProBlock(tokPtr);
} else if (okey != or_op) {
if (m_cumulative || okey != or_op) {
const ProKey &variable = getHashStr(tokPtr);
uint exprLen = getBlockLen(tokPtr);
const ushort *exprPtr = tokPtr;
......@@ -751,6 +745,11 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::visitProLoop(
ProStringList list = values(it_list.toKey());
if (list.isEmpty()) {
if (it_list == statics.strforever) {
if (m_cumulative) {
// The termination conditions wouldn't be evaluated, so we must skip it.
traceMsg("skipping forever loop in cumulative mode");
return ReturnFalse;
}
infinite = true;
} else {
const QString &itl = it_list.toQString(m_tmp1);
......@@ -761,6 +760,12 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::visitProLoop(
if (ok) {
int end = itl.mid(dotdot+2).toInt(&ok);
if (ok) {
if (m_cumulative && qAbs(end - start) > 100) {
// Such a loop is unlikely to contribute something useful to the
// file collection, and may cause considerable delay.
traceMsg("skipping excessive loop in cumulative mode");
return ReturnFalse;
}
if (start < end) {
for (int i = start; i <= end; i++)
list << ProString(QString::number(i));
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment