ProParser: Drop use of QLinkedList

Effectively 7cba2acd2cc and 0d88721d772 from qtbase.

Task-number: QTCREATORBUG-24098
Change-Id: I88902b358d88e34032f588b9eb0af13c5b9d8675
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This commit is contained in:
hjk
2020-06-23 07:29:27 +02:00
parent fd2236a59a
commit 59ddc75b59
3 changed files with 29 additions and 26 deletions

View File

@@ -1347,15 +1347,15 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateBuiltinConditional(
return ReturnFalse; return ReturnFalse;
} }
const ProKey &var = map(args.at(0)); const ProKey &var = map(args.at(0));
for (ProValueMapStack::Iterator vmi = m_valuemapStack.end(); for (ProValueMapStack::iterator vmi = m_valuemapStack.end();
--vmi != m_valuemapStack.begin(); ) { --vmi != m_valuemapStack.begin(); ) {
ProValueMap::Iterator it = (*vmi).find(var); ProValueMap::Iterator it = (*vmi).find(var);
if (it != (*vmi).end()) { if (it != (*vmi).end()) {
if (it->constBegin() == statics.fakeValue.constBegin()) { if (it->constBegin() == statics.fakeValue.constBegin()) {
// This is stupid, but qmake doesn't propagate deletions // This is stupid, but qmake doesn't propagate deletions
m_valuemapStack.first()[var] = ProStringList(); m_valuemapStack.front()[var] = ProStringList();
} else { } else {
m_valuemapStack.first()[var] = *it; m_valuemapStack.front()[var] = *it;
} }
(*vmi).erase(it); (*vmi).erase(it);
while (--vmi != m_valuemapStack.begin()) while (--vmi != m_valuemapStack.begin())
@@ -1370,7 +1370,7 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateBuiltinConditional(
evalError(fL1S("discard_from(file) requires one argument.")); evalError(fL1S("discard_from(file) requires one argument."));
return ReturnFalse; return ReturnFalse;
} }
if (m_valuemapStack.count() != 1) { if (m_valuemapStack.size() != 1) {
evalError(fL1S("discard_from() cannot be called from functions.")); evalError(fL1S("discard_from() cannot be called from functions."));
return ReturnFalse; return ReturnFalse;
} }
@@ -1379,7 +1379,7 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateBuiltinConditional(
int pro = m_vfs->idForFileName(fn, flags | QMakeVfs::VfsAccessedOnly); int pro = m_vfs->idForFileName(fn, flags | QMakeVfs::VfsAccessedOnly);
if (!pro) if (!pro)
return ReturnFalse; return ReturnFalse;
ProValueMap &vmap = m_valuemapStack.first(); ProValueMap &vmap = m_valuemapStack.front();
for (auto vit = vmap.begin(); vit != vmap.end(); ) { for (auto vit = vmap.begin(); vit != vmap.end(); ) {
if (!vit->isEmpty()) { if (!vit->isEmpty()) {
auto isFrom = [pro](const ProString &s) { auto isFrom = [pro](const ProString &s) {
@@ -1407,7 +1407,7 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateBuiltinConditional(
else else
++fit; ++fit;
} }
ProStringList &iif = m_valuemapStack.first()[ProKey("QMAKE_INTERNAL_INCLUDED_FILES")]; ProStringList &iif = m_valuemapStack.front()[ProKey("QMAKE_INTERNAL_INCLUDED_FILES")];
int idx = iif.indexOf(ProString(fn)); int idx = iif.indexOf(ProString(fn));
if (idx >= 0) if (idx >= 0)
iif.removeAt(idx); iif.removeAt(idx);

View File

@@ -596,14 +596,16 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::visitProBlock(
case TokBypassNesting: case TokBypassNesting:
blockLen = getBlockLen(tokPtr); blockLen = getBlockLen(tokPtr);
if ((m_cumulative || okey != or_op) && blockLen) { if ((m_cumulative || okey != or_op) && blockLen) {
ProValueMapStack savedValuemapStack = m_valuemapStack; ProValueMapStack savedValuemapStack = std::move(m_valuemapStack);
m_valuemapStack.clear(); m_valuemapStack.clear();
m_valuemapStack.append(savedValuemapStack.takeFirst()); m_valuemapStack.splice(m_valuemapStack.end(),
savedValuemapStack, savedValuemapStack.begin());
traceMsg("visiting nesting-bypassing block"); traceMsg("visiting nesting-bypassing block");
ret = visitProBlock(tokPtr); ret = visitProBlock(tokPtr);
traceMsg("visited nesting-bypassing block"); traceMsg("visited nesting-bypassing block");
savedValuemapStack.prepend(m_valuemapStack.first()); savedValuemapStack.splice(savedValuemapStack.begin(),
m_valuemapStack = savedValuemapStack; m_valuemapStack, m_valuemapStack.begin());
m_valuemapStack = std::move(savedValuemapStack);
} else { } else {
traceMsg("skipped nesting-bypassing block"); traceMsg("skipped nesting-bypassing block");
ret = ReturnTrue; ret = ReturnTrue;
@@ -1433,7 +1435,7 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::visitProFile(
for (ProValueMap::ConstIterator it = m_extraVars.constBegin(); for (ProValueMap::ConstIterator it = m_extraVars.constBegin();
it != m_extraVars.constEnd(); ++it) it != m_extraVars.constEnd(); ++it)
m_valuemapStack.first().insert(it.key(), it.value()); m_valuemapStack.front().insert(it.key(), it.value());
// In case default_pre needs to make decisions based on the current // In case default_pre needs to make decisions based on the current
// build pass configuration. // build pass configuration.
@@ -1700,7 +1702,7 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateFunction(
{ {
VisitReturn vr; VisitReturn vr;
if (m_valuemapStack.count() >= 100) { if (m_valuemapStack.size() >= 100) {
evalError(fL1S("Ran into infinite recursion (depth > 100).")); evalError(fL1S("Ran into infinite recursion (depth > 100)."));
vr = ReturnError; vr = ReturnError;
} else { } else {
@@ -1850,7 +1852,7 @@ static bool isFunctParam(const ProKey &variableName)
ProValueMap *QMakeEvaluator::findValues(const ProKey &variableName, ProValueMap::Iterator *rit) ProValueMap *QMakeEvaluator::findValues(const ProKey &variableName, ProValueMap::Iterator *rit)
{ {
ProValueMapStack::Iterator vmi = m_valuemapStack.end(); ProValueMapStack::iterator vmi = m_valuemapStack.end();
for (bool first = true; ; first = false) { for (bool first = true; ; first = false) {
--vmi; --vmi;
ProValueMap::Iterator it = (*vmi).find(variableName); ProValueMap::Iterator it = (*vmi).find(variableName);
@@ -1870,14 +1872,14 @@ ProValueMap *QMakeEvaluator::findValues(const ProKey &variableName, ProValueMap:
ProStringList &QMakeEvaluator::valuesRef(const ProKey &variableName) ProStringList &QMakeEvaluator::valuesRef(const ProKey &variableName)
{ {
ProValueMap::Iterator it = m_valuemapStack.top().find(variableName); ProValueMap::iterator it = m_valuemapStack.top().find(variableName);
if (it != m_valuemapStack.top().end()) { if (it != m_valuemapStack.top().end()) {
if (it->constBegin() == statics.fakeValue.constBegin()) if (it->constBegin() == statics.fakeValue.constBegin())
it->clear(); it->clear();
return *it; return *it;
} }
if (!isFunctParam(variableName)) { if (!isFunctParam(variableName)) {
ProValueMapStack::Iterator vmi = m_valuemapStack.end(); ProValueMapStack::iterator vmi = m_valuemapStack.end();
if (--vmi != m_valuemapStack.begin()) { if (--vmi != m_valuemapStack.begin()) {
do { do {
--vmi; --vmi;
@@ -1896,7 +1898,7 @@ ProStringList &QMakeEvaluator::valuesRef(const ProKey &variableName)
ProStringList QMakeEvaluator::values(const ProKey &variableName) const ProStringList QMakeEvaluator::values(const ProKey &variableName) const
{ {
ProValueMapStack::ConstIterator vmi = m_valuemapStack.constEnd(); ProValueMapStack::const_iterator vmi = m_valuemapStack.cend();
for (bool first = true; ; first = false) { for (bool first = true; ; first = false) {
--vmi; --vmi;
ProValueMap::ConstIterator it = (*vmi).constFind(variableName); ProValueMap::ConstIterator it = (*vmi).constFind(variableName);
@@ -1905,7 +1907,7 @@ ProStringList QMakeEvaluator::values(const ProKey &variableName) const
break; break;
return *it; return *it;
} }
if (vmi == m_valuemapStack.constBegin()) if (vmi == m_valuemapStack.cbegin())
break; break;
if (first && isFunctParam(variableName)) if (first && isFunctParam(variableName))
break; break;
@@ -1933,7 +1935,7 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateFile(
m_current = m_locationStack.pop(); m_current = m_locationStack.pop();
pro->deref(); pro->deref();
if (ok == ReturnTrue && !(flags & LoadHidden)) { if (ok == ReturnTrue && !(flags & LoadHidden)) {
ProStringList &iif = m_valuemapStack.first()[ProKey("QMAKE_INTERNAL_INCLUDED_FILES")]; ProStringList &iif = m_valuemapStack.front()[ProKey("QMAKE_INTERNAL_INCLUDED_FILES")];
ProString ifn(fileName); ProString ifn(fileName);
if (!iif.contains(ifn)) if (!iif.contains(ifn))
iif << ifn; iif << ifn;
@@ -2062,7 +2064,7 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateFileInto(
return ret; return ret;
*values = visitor.m_valuemapStack.top(); *values = visitor.m_valuemapStack.top();
ProKey qiif("QMAKE_INTERNAL_INCLUDED_FILES"); ProKey qiif("QMAKE_INTERNAL_INCLUDED_FILES");
ProStringList &iif = m_valuemapStack.first()[qiif]; ProStringList &iif = m_valuemapStack.front()[qiif];
const auto ifns = values->value(qiif); const auto ifns = values->value(qiif);
for (const ProString &ifn : ifns) for (const ProString &ifn : ifns)
if (!iif.contains(ifn)) if (!iif.contains(ifn))

View File

@@ -34,7 +34,6 @@
#include "ioutils.h" #include "ioutils.h"
#include <qlist.h> #include <qlist.h>
#include <qlinkedlist.h>
#include <qmap.h> #include <qmap.h>
#include <qset.h> #include <qset.h>
#include <qstack.h> #include <qstack.h>
@@ -50,6 +49,8 @@
# include <qmutex.h> # include <qmutex.h>
#endif #endif
#include <list>
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
class QMakeGlobals; class QMakeGlobals;
@@ -90,15 +91,15 @@ public:
#endif #endif
}; };
// We use a QLinkedList based stack instead of a QVector based one (QStack), so that // We use a list-based stack instead of a vector-based one, so that
// the addresses of value maps stay constant. The qmake generators rely on that. // the addresses of value maps stay constant. The qmake generators rely on that.
class QMAKE_EXPORT ProValueMapStack : public QLinkedList<ProValueMap> class QMAKE_EXPORT ProValueMapStack : public std::list<ProValueMap>
{ {
public: public:
inline void push(const ProValueMap &t) { append(t); } inline void push(const ProValueMap &t) { push_back(t); }
inline ProValueMap pop() { return takeLast(); } inline ProValueMap pop() { auto r = std::move(back()); pop_back(); return r; }
ProValueMap &top() { return last(); } ProValueMap &top() { return back(); }
const ProValueMap &top() const { return last(); } const ProValueMap &top() const { return back(); }
}; };
class QMAKE_EXPORT QMakeEvaluator class QMAKE_EXPORT QMakeEvaluator