From 8400896cfe3fbef7666329a2920bd0dbdd5890af Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Tue, 11 Sep 2012 19:30:29 +0200 Subject: 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 Reviewed-by: Joerg Bornemann Reviewed-by: Oswald Buddenhagen --- qmake/library/qmakeevaluator.cpp | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) (limited to 'qmake/library/qmakeevaluator.cpp') 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(); } -- cgit v1.2.3