From 9abbb0d49556bae1507456e20509137d01abe457 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Fri, 24 Mar 2017 11:02:32 +0100 Subject: TypeDatabase: Refactor TypeDatabase::normalizedSignature() The repeated construction of a QRegExp in loops shows up in the profiler. Change the API to accept a QString and store the regular expressions in a vector. Change-Id: Ic7ac7cdcd55beb901116589083f87c87fb48a4dd Reviewed-by: Christian Tismer --- ApiExtractor/abstractmetalang.cpp | 4 +-- ApiExtractor/typedatabase.cpp | 51 +++++++++++++++++++++++++++++---------- ApiExtractor/typedatabase.h | 2 +- ApiExtractor/typesystem.cpp | 8 +++--- 4 files changed, 45 insertions(+), 20 deletions(-) diff --git a/ApiExtractor/abstractmetalang.cpp b/ApiExtractor/abstractmetalang.cpp index 9137a94a2..b861f1b2f 100644 --- a/ApiExtractor/abstractmetalang.cpp +++ b/ApiExtractor/abstractmetalang.cpp @@ -537,7 +537,7 @@ QStringList AbstractMetaFunction::introspectionCompatibleSignatures(const QStrin AbstractMetaArgumentList arguments = this->arguments(); if (arguments.size() == resolvedArguments.size()) { QString signature = name() + QLatin1Char('(') + resolvedArguments.join(QLatin1Char(',')) + QLatin1Char(')'); - return QStringList(TypeDatabase::normalizedSignature(signature.toUtf8().constData())); + return QStringList(TypeDatabase::normalizedSignature(signature)); } else { QStringList returned; @@ -903,7 +903,7 @@ QString AbstractMetaFunction::minimalSignature() const if (isConstant()) minimalSignature += QLatin1String("const"); - minimalSignature = TypeDatabase::normalizedSignature(minimalSignature.toLocal8Bit().constData()); + minimalSignature = TypeDatabase::normalizedSignature(minimalSignature); m_cachedMinimalSignature = minimalSignature; return minimalSignature; diff --git a/ApiExtractor/typedatabase.cpp b/ApiExtractor/typedatabase.cpp index c6f42af7a..5cb255094 100644 --- a/ApiExtractor/typedatabase.cpp +++ b/ApiExtractor/typedatabase.cpp @@ -76,21 +76,46 @@ TypeDatabase* TypeDatabase::instance(bool newInstance) return db; } -QString TypeDatabase::normalizedSignature(const char* signature) -{ - QString normalized = QLatin1String(QMetaObject::normalizedSignature(signature)); +// A list of regex/replacements to fix int types like "ushort" to "unsigned short" +// unless present in TypeDatabase +struct IntTypeNormalizationEntry +{ + QRegularExpression regex; + QString replacement; +}; + +typedef QVector IntTypeNormalizationEntries; + +static const IntTypeNormalizationEntries &intTypeNormalizationEntries() +{ + static IntTypeNormalizationEntries result; + static bool firstTime = true; + if (firstTime) { + firstTime = false; + static const char *intTypes[] = {"char", "short", "int", "long"}; + const size_t size = sizeof(intTypes) / sizeof(intTypes[0]); + for (size_t i = 0; i < size; ++i) { + const QString intType = QLatin1String(intTypes[i]); + if (!TypeDatabase::instance()->findType(QLatin1Char('u') + intType)) { + IntTypeNormalizationEntry entry; + entry.replacement = QStringLiteral("unsigned ") + intType; + entry.regex.setPattern(QStringLiteral("\\bu") + intType + QStringLiteral("\\b")); + Q_ASSERT(entry.regex.isValid()); + result.append(entry); + } + } + } + return result; +} - if (!instance() || !QByteArray(signature).contains("unsigned")) - return normalized; +QString TypeDatabase::normalizedSignature(const QString &signature) +{ + QString normalized = QLatin1String(QMetaObject::normalizedSignature(signature.toUtf8().constData())); - QStringList types; - types << QLatin1String("char") << QLatin1String("short") - << QLatin1String("int") << QLatin1String("long"); - foreach (const QString& type, types) { - if (instance()->findType(QLatin1Char('u') + type)) - continue; - const QString pattern = QLatin1String("\\bu") + type + QLatin1String("\\b"); - normalized.replace(QRegExp(pattern), QLatin1String("unsigned ") + type); + if (instance() && signature.contains(QLatin1String("unsigned"))) { + const IntTypeNormalizationEntries &entries = intTypeNormalizationEntries(); + for (int i = 0, size = entries.size(); i < size; ++i) + normalized.replace(entries.at(i).regex, entries.at(i).replacement); } return normalized; diff --git a/ApiExtractor/typedatabase.h b/ApiExtractor/typedatabase.h index b28fc9ba4..4255cf458 100644 --- a/ApiExtractor/typedatabase.h +++ b/ApiExtractor/typedatabase.h @@ -72,7 +72,7 @@ public: */ static TypeDatabase* instance(bool newInstance = false); - static QString normalizedSignature(const char* signature); + static QString normalizedSignature(const QString &signature); QStringList requiredTargetImports() const; diff --git a/ApiExtractor/typesystem.cpp b/ApiExtractor/typesystem.cpp index f63f59114..869904d43 100644 --- a/ApiExtractor/typesystem.cpp +++ b/ApiExtractor/typesystem.cpp @@ -561,7 +561,7 @@ bool Handler::handleSmartPointerEntry(StackElement *element, QString refCountMethodName = attributes[QLatin1String("ref-count-method")]; QString signature = getter + QLatin1String("()"); - signature = TypeDatabase::normalizedSignature(signature.toLocal8Bit().constData()); + signature = TypeDatabase::normalizedSignature(signature); if (signature.isEmpty()) { m_error = QLatin1String("No signature for the smart pointer getter found."); return false; @@ -965,7 +965,7 @@ bool Handler::startElement(const QStringRef &n, const QXmlStreamAttributes &atts break; case StackElement::FunctionTypeEntry: { QString signature = attributes[QLatin1String("signature")]; - signature = TypeDatabase::normalizedSignature(signature.toLatin1().constData()); + signature = TypeDatabase::normalizedSignature(signature); element->entry = m_database->findType(name); if (element->entry) { if (element->entry->type() == TypeEntry::FunctionType) { @@ -1600,7 +1600,7 @@ bool Handler::startElement(const QStringRef &n, const QXmlStreamAttributes &atts } QString signature = attributes[QLatin1String("signature")]; - signature = TypeDatabase::normalizedSignature(signature.toLocal8Bit().constData()); + signature = TypeDatabase::normalizedSignature(signature); if (signature.isEmpty()) { m_error = QLatin1String("No signature for the added function"); return false; @@ -1645,7 +1645,7 @@ bool Handler::startElement(const QStringRef &n, const QXmlStreamAttributes &atts } QString signature = attributes[QLatin1String("signature")]; - signature = TypeDatabase::normalizedSignature(signature.toLocal8Bit().constData()); + signature = TypeDatabase::normalizedSignature(signature); if (signature.isEmpty()) { m_error = QLatin1String("No signature for modified function"); return false; -- cgit v1.2.3