diff options
author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2017-03-24 11:02:32 +0100 |
---|---|---|
committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2017-03-29 12:16:41 +0000 |
commit | 9abbb0d49556bae1507456e20509137d01abe457 (patch) | |
tree | 12af50a2c4084cc98c532d4741121b27071eb574 | |
parent | 7e508c15e9f6037a332b9055b04146287b20fb8f (diff) |
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 <tismer@stackless.com>
-rw-r--r-- | ApiExtractor/abstractmetalang.cpp | 4 | ||||
-rw-r--r-- | ApiExtractor/typedatabase.cpp | 51 | ||||
-rw-r--r-- | ApiExtractor/typedatabase.h | 2 | ||||
-rw-r--r-- | ApiExtractor/typesystem.cpp | 8 |
4 files changed, 45 insertions, 20 deletions
diff --git a/ApiExtractor/abstractmetalang.cpp b/ApiExtractor/abstractmetalang.cpp index 9137a94..b861f1b 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 c6f42af..5cb2550 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<IntTypeNormalizationEntry> 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 b28fc9b..4255cf4 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 f63f591..869904d 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; |