aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/qml/qqmlmetatype.cpp
diff options
context:
space:
mode:
authorMartin Jones <martin.jones@nokia.com>2012-05-18 10:54:09 +1000
committerQt by Nokia <qt-info@nokia.com>2012-05-23 06:54:25 +0200
commit9e239d0f653e8f37d0befb27aa3165d4723279a0 (patch)
tree7450301d665f7036da06b66f00f5397596b36eb2 /src/qml/qml/qqmlmetatype.cpp
parentefa9de71119853f89b4b175e7d537fbcc31a4848 (diff)
Optimize QML type registration.
Change-Id: I981f5e2e6d7f6089e9f326d41a65e54668b73120 Reviewed-by: Michael Brasser <michael.brasser@nokia.com>
Diffstat (limited to 'src/qml/qml/qqmlmetatype.cpp')
-rw-r--r--src/qml/qml/qqmlmetatype.cpp33
1 files changed, 27 insertions, 6 deletions
diff --git a/src/qml/qml/qqmlmetatype.cpp b/src/qml/qml/qqmlmetatype.cpp
index 1566d83a22..87c39b1859 100644
--- a/src/qml/qml/qqmlmetatype.cpp
+++ b/src/qml/qml/qqmlmetatype.cpp
@@ -190,6 +190,25 @@ public:
static QHash<const QMetaObject *, int> m_attachedPropertyIds;
};
+// Avoid multiple fromUtf8(), copies and hashing of the module name.
+// This is only called when metaTypeDataLock is locked.
+static QHashedString moduletoUtf8(const char *module)
+{
+ if (!module)
+ return QHashedString();
+
+ static const char *lastModule = 0;
+ static QHashedString lastModuleStr;
+
+ if (lastModule != module) {
+ lastModuleStr = QString::fromUtf8(module);
+ lastModuleStr.hash();
+ lastModule = module;
+ }
+
+ return lastModuleStr;
+}
+
QHash<const QMetaObject *, int> QQmlTypePrivate::m_attachedPropertyIds;
QQmlTypePrivate::QQmlTypePrivate()
@@ -219,14 +238,9 @@ QQmlType::QQmlType(int index, const QQmlPrivate::RegisterInterface &interface)
QQmlType::QQmlType(int index, const QQmlPrivate::RegisterType &type)
: d(new QQmlTypePrivate)
{
- d->m_module = QString::fromUtf8(type.uri);
+ d->m_module = moduletoUtf8(type.uri);
d->m_elementName = QString::fromUtf8(type.elementName);
- if (!d->m_module.isEmpty())
- d->m_name = static_cast<QString>(d->m_module) + QLatin1Char('/') + d->m_elementName;
- else
- d->m_name = d->m_elementName;
-
d->m_version_maj = type.versionMajor;
d->m_version_min = type.versionMinor;
if (type.version >= 1) // revisions added in version 1
@@ -498,6 +512,13 @@ const QString &QQmlType::elementName() const
const QString &QQmlType::qmlTypeName() const
{
+ if (d->m_name.isEmpty()) {
+ if (!d->m_module.isEmpty())
+ d->m_name = static_cast<QString>(d->m_module) + QLatin1Char('/') + d->m_elementName;
+ else
+ d->m_name = d->m_elementName;
+ }
+
return d->m_name;
}