aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2017-03-24 11:02:32 +0100
committerFriedemann Kleint <Friedemann.Kleint@qt.io>2017-03-29 12:16:41 +0000
commit9abbb0d49556bae1507456e20509137d01abe457 (patch)
tree12af50a2c4084cc98c532d4741121b27071eb574
parent7e508c15e9f6037a332b9055b04146287b20fb8f (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.cpp4
-rw-r--r--ApiExtractor/typedatabase.cpp51
-rw-r--r--ApiExtractor/typedatabase.h2
-rw-r--r--ApiExtractor/typesystem.cpp8
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<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 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;