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: QTBUG-8550 Change-Id: Iaa116086986cc7fd5023834753f791dd205102e5 Reviewed-by: Daniel Teske <daniel.teske@digia.com> Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@digia.com> (cherry picked from qttools/dd4d594c787a62fa8aa12695c5d115c71b59bacd) Reviewed-by: Joerg Bornemann <joerg.bornemann@theqtcompany.com>
This commit is contained in:
parent
e59d39c6fd
commit
3f723ff9a9
@ -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 = pro->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));
|
||||
|
Loading…
Reference in New Issue
Block a user