diff options
Diffstat (limited to 'qmake/library/qmakeevaluator.cpp')
-rw-r--r-- | qmake/library/qmakeevaluator.cpp | 43 |
1 files changed, 14 insertions, 29 deletions
diff --git a/qmake/library/qmakeevaluator.cpp b/qmake/library/qmakeevaluator.cpp index 723d5c7271..8e247d9afa 100644 --- a/qmake/library/qmakeevaluator.cpp +++ b/qmake/library/qmakeevaluator.cpp @@ -259,24 +259,6 @@ uint QMakeEvaluator::getBlockLen(const ushort *&tokPtr) return len; } -ProString QMakeEvaluator::getStr(const ushort *&tokPtr) -{ - uint len = *tokPtr++; - ProString ret(m_current.pro->items(), tokPtr - m_current.pro->tokPtr(), len); - ret.setSource(m_current.pro); - tokPtr += len; - return ret; -} - -ProKey QMakeEvaluator::getHashStr(const ushort *&tokPtr) -{ - uint hash = getBlockLen(tokPtr); - uint len = *tokPtr++; - ProKey ret(m_current.pro->items(), tokPtr - m_current.pro->tokPtr(), len, hash); - tokPtr += len; - return ret; -} - void QMakeEvaluator::skipStr(const ushort *&tokPtr) { uint len = *tokPtr++; @@ -315,7 +297,8 @@ ProStringList QMakeEvaluator::split_value_list(const QString &vals, const ProFil switch (unicode) { case '"': case '\'': - quote = unicode; + if (!quote) + quote = unicode; hadWord = true; break; case ' ': @@ -430,6 +413,7 @@ void QMakeEvaluator::evaluateExpression( const ushort *&tokPtr, ProStringList *ret, bool joined) { debugMsg(2, joined ? "evaluating joined expression" : "evaluating expression"); + ProFile *pro = m_current.pro; if (joined) *ret << ProString(); bool pending = false; @@ -445,35 +429,35 @@ void QMakeEvaluator::evaluateExpression( m_current.line = *tokPtr++; break; case TokLiteral: { - const ProString &val = getStr(tokPtr); + const ProString &val = pro->getStr(tokPtr); debugMsg(2, "literal %s", dbgStr(val)); addStr(val, ret, pending, joined); break; } case TokHashLiteral: { - const ProKey &val = getHashStr(tokPtr); + const ProKey &val = pro->getHashStr(tokPtr); debugMsg(2, "hashed literal %s", dbgStr(val.toString())); addStr(val, ret, pending, joined); break; } case TokVariable: { - const ProKey &var = getHashStr(tokPtr); + const ProKey &var = pro->getHashStr(tokPtr); const ProStringList &val = values(map(var)); debugMsg(2, "variable %s => %s", dbgKey(var), dbgStrList(val)); addStrList(val, tok, ret, pending, joined); break; } case TokProperty: { - const ProKey &var = getHashStr(tokPtr); + const ProKey &var = pro->getHashStr(tokPtr); const ProString &val = propertyValue(var); debugMsg(2, "property %s => %s", dbgKey(var), dbgStr(val)); addStr(val, ret, pending, joined); break; } case TokEnvVar: { - const ProString &var = getStr(tokPtr); + const ProString &var = pro->getStr(tokPtr); const ProString &val = ProString(m_option->getEnv(var.toQString(m_tmp1))); debugMsg(2, "env var %s => %s", dbgStr(var), dbgStr(val)); addStr(val, ret, pending, joined); break; } case TokFuncName: { - const ProKey &func = getHashStr(tokPtr); + const ProKey &func = pro->getHashStr(tokPtr); debugMsg(2, "function %s", dbgKey(func)); addStrList(evaluateExpandFunction(func, tokPtr), tok, ret, pending, joined); break; } @@ -538,6 +522,7 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::visitProBlock( { traceMsg("entering block"); ProStringList curr; + ProFile *pro = m_current.pro; bool okey = true, or_op = false, invert = false; uint blockLen; while (ushort tok = *tokPtr++) { @@ -597,7 +582,7 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::visitProBlock( blockLen = getBlockLen(tokPtr); ret = visitProBlock(tokPtr); } else if (okey != or_op) { - const ProKey &variable = getHashStr(tokPtr); + const ProKey &variable = pro->getHashStr(tokPtr); uint exprLen = getBlockLen(tokPtr); const ushort *exprPtr = tokPtr; tokPtr += exprLen; @@ -617,7 +602,7 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::visitProBlock( case TokTestDef: case TokReplaceDef: if (m_cumulative || okey != or_op) { - const ProKey &name = getHashStr(tokPtr); + const ProKey &name = pro->getHashStr(tokPtr); blockLen = getBlockLen(tokPtr); visitProFunctionDef(tok, name, tokPtr); traceMsg("defined %s function %s", @@ -797,8 +782,8 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::visitProLoop( forever { if (infinite) { if (!variable.isEmpty()) - m_valuemapStack.top()[variable] = ProStringList(ProString(QString::number(index++))); - if (index > 1000) { + m_valuemapStack.top()[variable] = ProStringList(ProString(QString::number(index))); + if (++index > 1000) { evalError(fL1S("Ran into infinite loop (> 1000 iterations).")); break; } |