From 18a515652a6eb7f54c6dd784feb63bd3ab87db76 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen <oswald.buddenhagen@nokia.com> Date: Tue, 19 Jan 2010 18:36:03 +0100 Subject: [PATCH] drastically cut down qregexp use this gives a rather impressive speed boost. if qmake wasn't trying to be so clever, we could get even more out of this. --- src/shared/proparser/profileevaluator.cpp | 30 ++++++++++++++--------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/src/shared/proparser/profileevaluator.cpp b/src/shared/proparser/profileevaluator.cpp index c32aaaee3b6..755785a9d3b 100644 --- a/src/shared/proparser/profileevaluator.cpp +++ b/src/shared/proparser/profileevaluator.cpp @@ -1605,7 +1605,7 @@ bool ProFileEvaluator::Private::isActiveConfig(const QString &config, bool regex if (m_option->target_mode == m_option->TARG_WIN_MODE && config == QLatin1String("win32")) return true; - if (regex) { + if (regex && (config.contains(QLatin1Char('*')) || config.contains(QLatin1Char('?')))) { QRegExp re(config, Qt::CaseSensitive, QRegExp::Wildcard); if (re.exactMatch(m_option->qmakespec)) @@ -1755,10 +1755,12 @@ QStringList ProFileEvaluator::Private::evaluateExpandFunction(const QString &fun } } if (!var.isNull()) { - foreach (const QString str, values(var)) { - if (regexp) - ret += str.section(QRegExp(sep), beg, end); - else + if (regexp) { + QRegExp sepRx(sep); + foreach (const QString &str, values(var)) + ret += str.section(sepRx, beg, end); + } else { + foreach (const QString &str, values(var)) ret += str.section(sep, beg, end); } } @@ -2207,9 +2209,12 @@ ProItem::ProItemReturn ProFileEvaluator::Private::evaluateConditionalFunction( return ProItem::ReturnFalse; if (args.count() == 2) return returnBool(vars.contains(args.at(1))); - QRegExp regx(args.at(2)); + QRegExp regx; + const QString &qry = args.at(2); + if (qry != QRegExp::escape(qry)) + regx.setPattern(qry); foreach (const QString &s, vars.value(args.at(1))) - if (s == regx.pattern() || regx.exactMatch(s)) + if ((!regx.isEmpty() && regx.exactMatch(s)) || s == qry) return ProItem::ReturnTrue; } return ProItem::ReturnFalse; @@ -2407,14 +2412,16 @@ ProItem::ProItemReturn ProFileEvaluator::Private::evaluateConditionalFunction( return ProItem::ReturnFalse; } - QRegExp regx(args[1]); + const QString &qry = args.at(1); + QRegExp regx; + if (qry != QRegExp::escape(qry)) + regx.setPattern(qry); const QStringList &l = values(args.first()); if (args.count() == 2) { for (int i = 0; i < l.size(); ++i) { const QString val = l[i]; - if (regx.exactMatch(val) || val == args[1]) { + if ((!regx.isEmpty() && regx.exactMatch(val)) || val == qry) return ProItem::ReturnTrue; - } } } else { const QStringList mutuals = args[2].split(QLatin1Char('|')); @@ -2422,7 +2429,8 @@ ProItem::ProItemReturn ProFileEvaluator::Private::evaluateConditionalFunction( const QString val = l[i]; for (int mut = 0; mut < mutuals.count(); mut++) { if (val == mutuals[mut].trimmed()) { - return returnBool(regx.exactMatch(val) || val == args[1]); + return returnBool((!regx.isEmpty() && regx.exactMatch(val)) + || val == qry); } } } -- GitLab