diff options
author | Oswald Buddenhagen <oswald.buddenhagen@nokia.com> | 2012-09-11 19:30:29 +0200 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-09-13 03:42:44 +0200 |
commit | 8400896cfe3fbef7666329a2920bd0dbdd5890af (patch) | |
tree | 4aeef74d80fcf6d7443c3790dcacf43a016c00e9 /qmake/library/qmakeevaluator.cpp | |
parent | ae3f95a951334dee001e37c305e4d7bf91c0d1b3 (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.cpp | 24 |
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(); } |