qmake: make QMakeEvaluator::isActiveConfig() take a QStringRef argument

saves some more cheap but pointless conversions to QString.

this makes the introduction of the ProStringList::contains(QStringRef)
overload necessary.

Change-Id: Ic61993bd9a4b28fbba1b8e346345fd5f5636c6f0
Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
(cherry picked from qtbase/11d957d04381c7162dd5621c61f9963580ec7041)
(cherry picked from qtbase/9f98935d33cc15c938be2b9295ba2fbe4edb0ee0)
Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
This commit is contained in:
Oswald Buddenhagen
2018-03-05 14:54:40 +01:00
parent bfbe67a255
commit d38ffb6b58
6 changed files with 25 additions and 12 deletions

View File

@@ -196,13 +196,15 @@ QVector<ProFileEvaluator::SourceFile> ProFileEvaluator::absoluteFileValues(
ProFileEvaluator::TemplateType ProFileEvaluator::templateType() const ProFileEvaluator::TemplateType ProFileEvaluator::templateType() const
{ {
static QString str_staticlib = QStringLiteral("staticlib");
const ProStringList &templ = d->values(ProKey("TEMPLATE")); const ProStringList &templ = d->values(ProKey("TEMPLATE"));
if (templ.count() >= 1) { if (templ.count() >= 1) {
const QString &t = templ.at(0).toQString(); const QString &t = templ.at(0).toQString();
if (!t.compare(QLatin1String("app"), Qt::CaseInsensitive)) if (!t.compare(QLatin1String("app"), Qt::CaseInsensitive))
return TT_Application; return TT_Application;
if (!t.compare(QLatin1String("lib"), Qt::CaseInsensitive)) if (!t.compare(QLatin1String("lib"), Qt::CaseInsensitive))
return d->isActiveConfig(QStringLiteral("staticlib")) ? TT_StaticLibrary : TT_SharedLibrary; return d->isActiveConfig(QStringRef(&str_staticlib)) ? TT_StaticLibrary : TT_SharedLibrary;
if (!t.compare(QLatin1String("script"), Qt::CaseInsensitive)) if (!t.compare(QLatin1String("script"), Qt::CaseInsensitive))
return TT_Script; return TT_Script;
if (!t.compare(QLatin1String("aux"), Qt::CaseInsensitive)) if (!t.compare(QLatin1String("aux"), Qt::CaseInsensitive))
@@ -224,6 +226,10 @@ bool ProFileEvaluator::loadNamedSpec(const QString &specDir, bool hostSpec)
bool ProFileEvaluator::accept(ProFile *pro, QMakeEvaluator::LoadFlags flags) bool ProFileEvaluator::accept(ProFile *pro, QMakeEvaluator::LoadFlags flags)
{ {
static QString str_no_include_pwd = QStringLiteral("no_include_pwd");
static QString str_plugin = QStringLiteral("plugin");
static QString str_plugin_no_share_shlib_cflags = QStringLiteral("plugin_no_share_shlib_cflags");
if (d->visitProFile(pro, QMakeHandler::EvalProjectFile, flags) != QMakeEvaluator::ReturnTrue) if (d->visitProFile(pro, QMakeHandler::EvalProjectFile, flags) != QMakeEvaluator::ReturnTrue)
return false; return false;
@@ -232,7 +238,7 @@ bool ProFileEvaluator::accept(ProFile *pro, QMakeEvaluator::LoadFlags flags)
ProStringList &incpath = d->valuesRef(ProKey("INCLUDEPATH")); ProStringList &incpath = d->valuesRef(ProKey("INCLUDEPATH"));
incpath += d->values(ProKey("QMAKE_INCDIR")); incpath += d->values(ProKey("QMAKE_INCDIR"));
if (!d->isActiveConfig(QStringLiteral("no_include_pwd"))) { if (!d->isActiveConfig(QStringRef(&str_no_include_pwd))) {
incpath.prepend(ProString(pro->directoryName())); incpath.prepend(ProString(pro->directoryName()));
// It's pretty stupid that this is appended - it should be the second entry. // It's pretty stupid that this is appended - it should be the second entry.
if (pro->directoryName() != d->m_outputDir) if (pro->directoryName() != d->m_outputDir)
@@ -249,8 +255,8 @@ bool ProFileEvaluator::accept(ProFile *pro, QMakeEvaluator::LoadFlags flags)
break; break;
case TT_SharedLibrary: case TT_SharedLibrary:
{ {
bool plugin = d->isActiveConfig(QStringLiteral("plugin")); bool plugin = d->isActiveConfig(QStringRef(&str_plugin));
if (!plugin || !d->isActiveConfig(QStringLiteral("plugin_no_share_shlib_cflags"))) if (!plugin || !d->isActiveConfig(QStringRef(&str_plugin_no_share_shlib_cflags)))
cxxflags += d->values(ProKey("QMAKE_CXXFLAGS_SHLIB")); cxxflags += d->values(ProKey("QMAKE_CXXFLAGS_SHLIB"));
if (plugin) if (plugin)
cxxflags += d->values(ProKey("QMAKE_CXXFLAGS_PLUGIN")); cxxflags += d->values(ProKey("QMAKE_CXXFLAGS_PLUGIN"));

View File

@@ -458,6 +458,14 @@ bool ProStringList::contains(const ProString &str, Qt::CaseSensitivity cs) const
return false; return false;
} }
bool ProStringList::contains(const QStringRef &str, Qt::CaseSensitivity cs) const
{
for (int i = 0; i < size(); i++)
if (!at(i).toQStringRef().compare(str, cs))
return true;
return false;
}
bool ProStringList::contains(const char *str, Qt::CaseSensitivity cs) const bool ProStringList::contains(const char *str, Qt::CaseSensitivity cs) const
{ {
for (int i = 0; i < size(); i++) for (int i = 0; i < size(); i++)

View File

@@ -244,6 +244,7 @@ public:
void removeDuplicates(); void removeDuplicates();
bool contains(const ProString &str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const; bool contains(const ProString &str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
bool contains(const QStringRef &str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
bool contains(const QString &str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const bool contains(const QString &str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
{ return contains(ProString(str), cs); } { return contains(ProString(str), cs); }
bool contains(const char *str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const; bool contains(const char *str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;

View File

@@ -1447,7 +1447,7 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateBuiltinConditional(
return ReturnFalse; return ReturnFalse;
} }
if (args.count() == 1) if (args.count() == 1)
return returnBool(isActiveConfig(args.at(0).toQString(m_tmp2))); return returnBool(isActiveConfig(args.at(0).toQStringRef()));
const QStringList &mutuals = args.at(1).toQString(m_tmp2).split(QLatin1Char('|')); const QStringList &mutuals = args.at(1).toQString(m_tmp2).split(QLatin1Char('|'));
const ProStringList &configs = values(statics.strCONFIG); const ProStringList &configs = values(statics.strCONFIG);

View File

@@ -645,7 +645,7 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::visitProBlock(
evalError(fL1S("Conditional must expand to exactly one word.")); evalError(fL1S("Conditional must expand to exactly one word."));
okey = false; okey = false;
} else { } else {
okey = isActiveConfig(curr.at(0).toQString(m_tmp2), true); okey = isActiveConfig(curr.at(0).toQStringRef(), true);
traceMsg("condition %s is %s", dbgStr(curr.at(0)), dbgBool(okey)); traceMsg("condition %s is %s", dbgStr(curr.at(0)), dbgBool(okey));
okey ^= invert; okey ^= invert;
} }
@@ -1621,7 +1621,7 @@ QString QMakeEvaluator::currentDirectory() const
return QString(); return QString();
} }
bool QMakeEvaluator::isActiveConfig(const QString &config, bool regex) bool QMakeEvaluator::isActiveConfig(const QStringRef &config, bool regex)
{ {
// magic types for easy flipping // magic types for easy flipping
if (config == statics.strtrue) if (config == statics.strtrue)
@@ -1633,9 +1633,7 @@ bool QMakeEvaluator::isActiveConfig(const QString &config, bool regex)
return m_hostBuild; return m_hostBuild;
if (regex && (config.contains(QLatin1Char('*')) || config.contains(QLatin1Char('?')))) { if (regex && (config.contains(QLatin1Char('*')) || config.contains(QLatin1Char('?')))) {
QString cfg = config; QRegExp re(config.toString(), Qt::CaseSensitive, QRegExp::Wildcard);
cfg.detach(); // Keep m_tmp out of QRegExp's cache
QRegExp re(cfg, Qt::CaseSensitive, QRegExp::Wildcard);
// mkspecs // mkspecs
if (re.exactMatch(m_qmakespecName)) if (re.exactMatch(m_qmakespecName))
@@ -1655,7 +1653,7 @@ bool QMakeEvaluator::isActiveConfig(const QString &config, bool regex)
return true; return true;
// CONFIG variable // CONFIG variable
if (values(statics.strCONFIG).contains(ProString(config))) if (values(statics.strCONFIG).contains(config))
return true; return true;
} }

View File

@@ -220,7 +220,7 @@ public:
void updateMkspecPaths(); void updateMkspecPaths();
void updateFeaturePaths(); void updateFeaturePaths();
bool isActiveConfig(const QString &config, bool regex = false); bool isActiveConfig(const QStringRef &config, bool regex = false);
void populateDeps( void populateDeps(
const ProStringList &deps, const ProString &prefix, const ProStringList &suffixes, const ProStringList &deps, const ProString &prefix, const ProStringList &suffixes,