aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorOswald Buddenhagen <oswald.buddenhagen@qt.io>2017-08-11 14:55:37 +0200
committerOswald Buddenhagen <oswald.buddenhagen@qt.io>2018-03-14 15:34:25 +0000
commit10f5676cab339e0318accdb7f8cb9a3858692e85 (patch)
tree760ddf1a4f9b5c97d14bd297c7b3466bf0a6be5a /src
parent11753bfd9d139e7dbfe47a37d2cf27c32cb6bf27 (diff)
qmake: fix raw data detach avoidance
the m_tmp array is a member, so the index toggle for accessing it also needs to be one - otherwise, odd iteration counts will defeat the mechanism. Change-Id: If7a800ed5a4b4168625daf1ebbd5d2d164569d8e Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io> (cherry picked from qtbase/ccb8afcda752093bfb6bc32f560131a91bd826a1) Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/shared/proparser/qmakebuiltins.cpp12
-rw-r--r--src/shared/proparser/qmakeevaluator.cpp5
-rw-r--r--src/shared/proparser/qmakeevaluator.h1
3 files changed, 6 insertions, 12 deletions
diff --git a/src/shared/proparser/qmakebuiltins.cpp b/src/shared/proparser/qmakebuiltins.cpp
index 54d0fb2c00..2dc4d87a71 100644
--- a/src/shared/proparser/qmakebuiltins.cpp
+++ b/src/shared/proparser/qmakebuiltins.cpp
@@ -884,12 +884,10 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateBuiltinExpand(
evalError(fL1S("find(var, str) requires two arguments."));
} else {
QRegExp regx(args.at(1).toQString());
- int t = 0;
const auto vals = values(map(args.at(0)));
for (const ProString &val : vals) {
- if (regx.indexIn(val.toQString(m_tmp[t])) != -1)
+ if (regx.indexIn(val.toQString(m_tmp[m_toggle ^= 1])) != -1)
ret += val;
- t ^= 1;
}
}
break;
@@ -1389,12 +1387,10 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateBuiltinConditional(
copy.detach();
regx.setPattern(copy);
}
- int t = 0;
const auto strings = vars.value(map(args.at(1)));
for (const ProString &s : strings) {
- if ((!regx.isEmpty() && regx.exactMatch(s.toQString(m_tmp[t]))) || s == qry)
+ if ((!regx.isEmpty() && regx.exactMatch(s.toQString(m_tmp[m_toggle ^= 1]))) || s == qry)
return ReturnTrue;
- t ^= 1;
}
}
return ReturnFalse;
@@ -1459,12 +1455,10 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateBuiltinConditional(
}
const ProStringList &l = values(map(args.at(0)));
if (args.count() == 2) {
- int t = 0;
for (int i = 0; i < l.size(); ++i) {
const ProString &val = l[i];
- if ((!regx.isEmpty() && regx.exactMatch(val.toQString(m_tmp[t]))) || val == qry)
+ if ((!regx.isEmpty() && regx.exactMatch(val.toQString(m_tmp[m_toggle ^= 1]))) || val == qry)
return ReturnTrue;
- t ^= 1;
}
} else {
const auto mutuals = args.at(2).toQStringRef().split(QLatin1Char('|'));
diff --git a/src/shared/proparser/qmakeevaluator.cpp b/src/shared/proparser/qmakeevaluator.cpp
index cfb78fc1d5..cbaf28440f 100644
--- a/src/shared/proparser/qmakeevaluator.cpp
+++ b/src/shared/proparser/qmakeevaluator.cpp
@@ -223,6 +223,7 @@ QMakeEvaluator::QMakeEvaluator(QMakeGlobals *option, QMakeParser *parser, QMakeV
m_skipLevel = 0;
#endif
m_listCount = 0;
+ m_toggle = 0;
m_valuemapStack.push(ProValueMap());
m_valuemapInited = false;
}
@@ -1648,12 +1649,10 @@ bool QMakeEvaluator::isActiveConfig(const QStringRef &config, bool regex)
return true;
// CONFIG variable
- int t = 0;
const auto configValues = values(statics.strCONFIG);
for (const ProString &configValue : configValues) {
- if (re.exactMatch(configValue.toQString(m_tmp[t])))
+ if (re.exactMatch(configValue.toQString(m_tmp[m_toggle ^= 1])))
return true;
- t ^= 1;
}
} else {
// mkspecs
diff --git a/src/shared/proparser/qmakeevaluator.h b/src/shared/proparser/qmakeevaluator.h
index c39b8abcde..21e13451d6 100644
--- a/src/shared/proparser/qmakeevaluator.h
+++ b/src/shared/proparser/qmakeevaluator.h
@@ -283,6 +283,7 @@ public:
QString m_outputDir;
int m_listCount;
+ int m_toggle;
bool m_valuemapInited;
bool m_hostBuild;
QString m_qmakespec;