diff options
author | Martin Jones <martin.jones@nokia.com> | 2012-05-18 10:54:09 +1000 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-05-23 06:54:25 +0200 |
commit | 9e239d0f653e8f37d0befb27aa3165d4723279a0 (patch) | |
tree | 7450301d665f7036da06b66f00f5397596b36eb2 /src/qml/qml/qqmlmetatype.cpp | |
parent | efa9de71119853f89b4b175e7d537fbcc31a4848 (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.cpp | 33 |
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; } |