diff options
author | Simon Hausmann <simon.hausmann@theqtcompany.com> | 2015-06-03 10:23:56 +0200 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@theqtcompany.com> | 2015-06-03 10:23:56 +0200 |
commit | e2f66f921594b7be4af4a058c959557489e86879 (patch) | |
tree | cc44931708b57bd5a761906797c7dee0360d1d6b /qmake/library | |
parent | 933bf178aab88ab5df8a68cbf02611d6d8744b1b (diff) | |
parent | 754efa57d89c62d1796e01b407e9222e67450f52 (diff) |
Merge remote-tracking branch 'origin/5.5' into dev
Conflicts:
src/corelib/global/qnamespace.qdoc
src/corelib/io/qwindowspipereader.cpp
src/corelib/io/qwindowspipereader_p.h
src/corelib/statemachine/qstatemachine.cpp
src/corelib/statemachine/qstatemachine_p.h
src/plugins/platforms/xcb/qxcbconnection.h
tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp
tests/auto/tools/qmake/tst_qmake.cpp
tests/manual/touch/main.cpp
Change-Id: I917d694890e79ee3da7d65134b5b085e23e0dd62
Diffstat (limited to 'qmake/library')
-rw-r--r-- | qmake/library/proitems.cpp | 31 | ||||
-rw-r--r-- | qmake/library/proitems.h | 3 | ||||
-rw-r--r-- | qmake/library/qmakebuiltins.cpp | 10 | ||||
-rw-r--r-- | qmake/library/qmakeevaluator.cpp | 43 | ||||
-rw-r--r-- | qmake/library/qmakeevaluator.h | 2 | ||||
-rw-r--r-- | qmake/library/qmakeglobals.h | 1 |
6 files changed, 54 insertions, 36 deletions
diff --git a/qmake/library/proitems.cpp b/qmake/library/proitems.cpp index e780259417..a610da6b69 100644 --- a/qmake/library/proitems.cpp +++ b/qmake/library/proitems.cpp @@ -159,6 +159,18 @@ QString &ProString::toQString(QString &tmp) const return tmp.setRawData(m_string.constData() + m_offset, m_length); } +/*! + * \brief ProString::prepareExtend + * \param extraLen number of new characters to be added + * \param thisTarget offset to which current contents should be moved + * \param extraTarget offset at which new characters will be added + * \return pointer to storage location for new characters + * + * Prepares the string for adding new characters. + * If the string is detached and has enough space, it will be changed in place. + * Otherwise, it will be replaced with a new string object, thus detaching. + * In either case, the hash will be reset. + */ QChar *ProString::prepareExtend(int extraLen, int thisTarget, int extraTarget) { if (m_string.isDetached() && m_length + extraLen <= m_string.capacity()) { @@ -473,4 +485,23 @@ ProFile::~ProFile() { } +ProString ProFile::getStr(const ushort *&tPtr) +{ + uint len = *tPtr++; + ProString ret(items(), tPtr - tokPtr(), len); + ret.setSource(this); + tPtr += len; + return ret; +} + +ProKey ProFile::getHashStr(const ushort *&tPtr) +{ + uint hash = *tPtr++; + hash |= (uint)*tPtr++ << 16; + uint len = *tPtr++; + ProKey ret(items(), tPtr - tokPtr(), len, hash); + tPtr += len; + return ret; +} + QT_END_NAMESPACE diff --git a/qmake/library/proitems.h b/qmake/library/proitems.h index d31367361d..9430d28521 100644 --- a/qmake/library/proitems.h +++ b/qmake/library/proitems.h @@ -352,6 +352,9 @@ public: bool isHostBuild() const { return m_hostBuild; } void setHostBuild(bool host_build) { m_hostBuild = host_build; } + ProString getStr(const ushort *&tPtr); + ProKey getHashStr(const ushort *&tPtr); + private: ProItemRefCount m_refCount; QString m_proitems; diff --git a/qmake/library/qmakebuiltins.cpp b/qmake/library/qmakebuiltins.cpp index e384d26f4c..02d5d5dd31 100644 --- a/qmake/library/qmakebuiltins.cpp +++ b/qmake/library/qmakebuiltins.cpp @@ -214,7 +214,7 @@ static QString windowsErrorCode() NULL); QString ret = QString::fromWCharArray(string); LocalFree((HLOCAL)string); - return ret; + return ret.trimmed(); } #endif @@ -362,7 +362,7 @@ QMakeEvaluator::writeFile(const QString &ctx, const QString &fn, QIODevice::Open { QString errStr; if (!m_vfs->writeFile(fn, mode, contents, &errStr)) { - evalError(fL1S("Cannot write %1file %2: %3.") + evalError(fL1S("Cannot write %1file %2: %3") .arg(ctx, QDir::toNativeSeparators(fn), errStr)); return ReturnFalse; } @@ -1121,7 +1121,7 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateBuiltinConditional( switch (func_t) { case T_DEFINED: { if (args.count() < 1 || args.count() > 2) { - evalError(fL1S("defined(function, [\"test\"|\"replace\"])" + evalError(fL1S("defined(function, [\"test\"|\"replace\"|\"var\"])" " requires one or two arguments.")); return ReturnFalse; } @@ -1582,7 +1582,7 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateBuiltinConditional( GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (rHand == INVALID_HANDLE_VALUE) { - evalError(fL1S("Cannot open() reference file %1: %2.").arg(rfn, windowsErrorCode())); + evalError(fL1S("Cannot open reference file %1: %2").arg(rfn, windowsErrorCode())); return ReturnFalse; } FILETIME ft; @@ -1592,7 +1592,7 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateBuiltinConditional( GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (wHand == INVALID_HANDLE_VALUE) { - evalError(fL1S("Cannot open() %1: %2.").arg(tfn, windowsErrorCode())); + evalError(fL1S("Cannot open %1: %2").arg(tfn, windowsErrorCode())); return ReturnFalse; } SetFileTime(wHand, 0, 0, &ft); 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; } diff --git a/qmake/library/qmakeevaluator.h b/qmake/library/qmakeevaluator.h index 4f2acf25ee..a60adde84e 100644 --- a/qmake/library/qmakeevaluator.h +++ b/qmake/library/qmakeevaluator.h @@ -150,8 +150,6 @@ public: { return b ? ReturnTrue : ReturnFalse; } static ALWAYS_INLINE uint getBlockLen(const ushort *&tokPtr); - ProString getStr(const ushort *&tokPtr); - ProKey getHashStr(const ushort *&tokPtr); void evaluateExpression(const ushort *&tokPtr, ProStringList *ret, bool joined); static ALWAYS_INLINE void skipStr(const ushort *&tokPtr); static ALWAYS_INLINE void skipHashStr(const ushort *&tokPtr); diff --git a/qmake/library/qmakeglobals.h b/qmake/library/qmakeglobals.h index 7c77450523..de46ebbe74 100644 --- a/qmake/library/qmakeglobals.h +++ b/qmake/library/qmakeglobals.h @@ -135,6 +135,7 @@ public: bool initProperties(); # else void setProperties(const QHash<QString, QString> &props); + void setProperties(const QHash<ProKey, ProString> &props) { properties = props; } # endif ProString propertyValue(const ProKey &name) const { return properties.value(name); } #endif |