summaryrefslogtreecommitdiffstats
path: root/qmake/library/qmakeevaluator.cpp
diff options
context:
space:
mode:
authorOswald Buddenhagen <oswald.buddenhagen@nokia.com>2012-09-11 19:30:29 +0200
committerQt by Nokia <qt-info@nokia.com>2012-09-13 03:42:44 +0200
commit8400896cfe3fbef7666329a2920bd0dbdd5890af (patch)
tree4aeef74d80fcf6d7443c3790dcacf43a016c00e9 /qmake/library/qmakeevaluator.cpp
parentae3f95a951334dee001e37c305e4d7bf91c0d1b3 (diff)
don't pretend that break()/next()/return() are functions
it's a pretty braindead thing to implement control flow statements as (built-in) functions. as a "side effect", this fixes return() value handling for lists. (cherry picked from qtcreator/f53ed6c4b3feca59a94d4f0de8b1a7411122e30e) (cherry picked from qtcreator/f529e22ec38fb9a656d74394e484d2453cf42c69) Change-Id: I59c8efa0e4d65329327115f7f8ed20719e7f7546 Reviewed-by: Qt Doc Bot <qt_docbot@qt-project.org> Reviewed-by: Joerg Bornemann <joerg.bornemann@nokia.com> Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@nokia.com>
Diffstat (limited to 'qmake/library/qmakeevaluator.cpp')
-rw-r--r--qmake/library/qmakeevaluator.cpp24
1 files changed, 18 insertions, 6 deletions
diff --git a/qmake/library/qmakeevaluator.cpp b/qmake/library/qmakeevaluator.cpp
index 4376865820..687bb3a829 100644
--- a/qmake/library/qmakeevaluator.cpp
+++ b/qmake/library/qmakeevaluator.cpp
@@ -195,7 +195,6 @@ QMakeEvaluator::QMakeEvaluator(QMakeGlobals *option,
#ifdef PROEVALUATOR_CUMULATIVE
m_skipLevel = 0;
#endif
- m_loopLevel = 0;
m_listCount = 0;
m_valuemapStack.push(ProValueMap());
m_valuemapInited = false;
@@ -684,6 +683,24 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::visitProBlock(
invert = false;
curr.clear();
continue;
+ case TokReturn:
+ m_returnValue = curr;
+ curr.clear();
+ ret = ReturnReturn;
+ goto ctrlstm;
+ case TokBreak:
+ ret = ReturnBreak;
+ goto ctrlstm;
+ case TokNext:
+ ret = ReturnNext;
+ ctrlstm:
+ if (!m_skipLevel && okey != or_op) {
+ traceMsg("flow control statement '%s', aborting block", dbgReturn(ret));
+ return ret;
+ }
+ traceMsg("skipped flow control statement '%s'", dbgReturn(ret));
+ okey = false, or_op = true; // force next evaluation
+ continue;
default: {
const ushort *oTokPtr = --tokPtr;
evaluateExpression(tokPtr, &curr, false);
@@ -763,7 +780,6 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::visitProLoop(
else
traceMsg("entering loop for %s over %s", dbgKey(variable), dbgStrList(list));
- m_loopLevel++;
forever {
if (infinite) {
if (!variable.isEmpty())
@@ -800,7 +816,6 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::visitProLoop(
}
}
do_break:
- m_loopLevel--;
traceMsg("done looping");
@@ -1576,8 +1591,6 @@ ProStringList QMakeEvaluator::evaluateFunction(
} else {
m_valuemapStack.push(ProValueMap());
m_locationStack.push(m_current);
- int loopLevel = m_loopLevel;
- m_loopLevel = 0;
ProStringList args;
for (int i = 0; i < argumentsList.count(); ++i) {
@@ -1590,7 +1603,6 @@ ProStringList QMakeEvaluator::evaluateFunction(
ret = m_returnValue;
m_returnValue.clear();
- m_loopLevel = loopLevel;
m_current = m_locationStack.pop();
m_valuemapStack.pop();
}