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
|
okey = true, or_op = false; // force next evaluation
|
||||||
break;
|
break;
|
||||||
case TokForLoop:
|
case TokForLoop:
|
||||||
if (m_cumulative) { // This is a no-win situation, so just pretend it's no loop
|
if (m_cumulative || okey != or_op) {
|
||||||
skipHashStr(tokPtr);
|
|
||||||
uint exprLen = getBlockLen(tokPtr);
|
|
||||||
tokPtr += exprLen;
|
|
||||||
blockLen = getBlockLen(tokPtr);
|
|
||||||
ret = visitProBlock(tokPtr);
|
|
||||||
} else if (okey != or_op) {
|
|
||||||
const ProKey &variable = pro->getHashStr(tokPtr);
|
const ProKey &variable = pro->getHashStr(tokPtr);
|
||||||
uint exprLen = getBlockLen(tokPtr);
|
uint exprLen = getBlockLen(tokPtr);
|
||||||
const ushort *exprPtr = tokPtr;
|
const ushort *exprPtr = tokPtr;
|
||||||
@ -751,6 +745,11 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::visitProLoop(
|
|||||||
ProStringList list = values(it_list.toKey());
|
ProStringList list = values(it_list.toKey());
|
||||||
if (list.isEmpty()) {
|
if (list.isEmpty()) {
|
||||||
if (it_list == statics.strforever) {
|
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;
|
infinite = true;
|
||||||
} else {
|
} else {
|
||||||
const QString &itl = it_list.toQString(m_tmp1);
|
const QString &itl = it_list.toQString(m_tmp1);
|
||||||
@ -761,6 +760,12 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::visitProLoop(
|
|||||||
if (ok) {
|
if (ok) {
|
||||||
int end = itl.mid(dotdot+2).toInt(&ok);
|
int end = itl.mid(dotdot+2).toInt(&ok);
|
||||||
if (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) {
|
if (start < end) {
|
||||||
for (int i = start; i <= end; i++)
|
for (int i = start; i <= end; i++)
|
||||||
list << ProString(QString::number(i));
|
list << ProString(QString::number(i));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user