forked from qt-creator/qt-creator
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:
@@ -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);
|
||||||
|
@@ -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))
|
||||||
|
@@ -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
|
||||||
|
Reference in New Issue
Block a user