class QQmlPropertyValueInterceptor;
+#define QML_GETTYPENAMES \
+ const char *className = T::staticMetaObject.className(); \
+ int nameLen = strlen(className); \
+ QVarLengthArray<char,48> pointerName(nameLen+2); \
+ memcpy(pointerName.data(), className, nameLen); \
+ pointerName[nameLen] = '*'; \
+ pointerName[nameLen+1] = '\0'; \
+ int listLen = strlen("QQmlListProperty<"); \
+ QVarLengthArray<char,64> listName(listLen + nameLen + 2); \
+ memcpy(listName.data(), "QQmlListProperty<", listLen); \
+ memcpy(listName.data()+listLen, className, nameLen); \
+ listName[listLen+nameLen] = '>'; \
+ listName[listLen+nameLen+1] = '\0';
+
template<typename T>
int qmlRegisterType()
{
- QByteArray name(T::staticMetaObject.className());
-
- QByteArray pointerName(name + '*');
- QByteArray listName("QQmlListProperty<" + name + '>');
+ QML_GETTYPENAMES
QQmlPrivate::RegisterType type = {
0,
- qRegisterMetaType<T *>(pointerName.constData()),
- qRegisterMetaType<QQmlListProperty<T> >(listName.constData()),
+ qRegisterNormalizedMetaType<T *>(pointerName.constData()),
+ qRegisterNormalizedMetaType<QQmlListProperty<T> >(listName.constData()),
0, 0,
QString(),
template<typename T>
int qmlRegisterUncreatableType(const char *uri, int versionMajor, int versionMinor, const char *qmlName, const QString& reason)
{
- QByteArray name(T::staticMetaObject.className());
-
- QByteArray pointerName(name + '*');
- QByteArray listName("QQmlListProperty<" + name + '>');
+ QML_GETTYPENAMES
QQmlPrivate::RegisterType type = {
0,
- qRegisterMetaType<T *>(pointerName.constData()),
- qRegisterMetaType<QQmlListProperty<T> >(listName.constData()),
+ qRegisterNormalizedMetaType<T *>(pointerName.constData()),
+ qRegisterNormalizedMetaType<QQmlListProperty<T> >(listName.constData()),
0, 0,
reason,
template<typename T>
int qmlRegisterType(const char *uri, int versionMajor, int versionMinor, const char *qmlName)
{
- QByteArray name(T::staticMetaObject.className());
-
- QByteArray pointerName(name + '*');
- QByteArray listName("QQmlListProperty<" + name + '>');
+ QML_GETTYPENAMES
QQmlPrivate::RegisterType type = {
0,
- qRegisterMetaType<T *>(pointerName.constData()),
- qRegisterMetaType<QQmlListProperty<T> >(listName.constData()),
+ qRegisterNormalizedMetaType<T *>(pointerName.constData()),
+ qRegisterNormalizedMetaType<QQmlListProperty<T> >(listName.constData()),
sizeof(T), QQmlPrivate::createInto<T>,
QString(),
template<typename T, int metaObjectRevision>
int qmlRegisterType(const char *uri, int versionMajor, int versionMinor, const char *qmlName)
{
- QByteArray name(T::staticMetaObject.className());
-
- QByteArray pointerName(name + '*');
- QByteArray listName("QQmlListProperty<" + name + '>');
+ QML_GETTYPENAMES
QQmlPrivate::RegisterType type = {
1,
- qRegisterMetaType<T *>(pointerName.constData()),
- qRegisterMetaType<QQmlListProperty<T> >(listName.constData()),
+ qRegisterNormalizedMetaType<T *>(pointerName.constData()),
+ qRegisterNormalizedMetaType<QQmlListProperty<T> >(listName.constData()),
sizeof(T), QQmlPrivate::createInto<T>,
QString(),
template<typename T, int metaObjectRevision>
int qmlRegisterRevision(const char *uri, int versionMajor, int versionMinor)
{
- QByteArray name(T::staticMetaObject.className());
-
- QByteArray pointerName(name + '*');
- QByteArray listName("QQmlListProperty<" + name + '>');
+ QML_GETTYPENAMES
QQmlPrivate::RegisterType type = {
1,
- qRegisterMetaType<T *>(pointerName.constData()),
- qRegisterMetaType<QQmlListProperty<T> >(listName.constData()),
+ qRegisterNormalizedMetaType<T *>(pointerName.constData()),
+ qRegisterNormalizedMetaType<QQmlListProperty<T> >(listName.constData()),
sizeof(T), QQmlPrivate::createInto<T>,
QString(),
template<typename T, typename E>
int qmlRegisterExtendedType()
{
- QByteArray name(T::staticMetaObject.className());
-
- QByteArray pointerName(name + '*');
- QByteArray listName("QQmlListProperty<" + name + '>');
+ QML_GETTYPENAMES
QQmlPrivate::RegisterType type = {
0,
- qRegisterMetaType<T *>(pointerName.constData()),
- qRegisterMetaType<QQmlListProperty<T> >(listName.constData()),
+ qRegisterNormalizedMetaType<T *>(pointerName.constData()),
+ qRegisterNormalizedMetaType<QQmlListProperty<T> >(listName.constData()),
0, 0,
QString(),
int qmlRegisterExtendedType(const char *uri, int versionMajor, int versionMinor,
const char *qmlName)
{
- QByteArray name(T::staticMetaObject.className());
-
- QByteArray pointerName(name + '*');
- QByteArray listName("QQmlListProperty<" + name + '>');
+ QML_GETTYPENAMES
QQmlAttachedPropertiesFunc attached = QQmlPrivate::attachedPropertiesFunc<E>();
const QMetaObject * attachedMetaObject = QQmlPrivate::attachedPropertiesMetaObject<E>();
QQmlPrivate::RegisterType type = {
0,
- qRegisterMetaType<T *>(pointerName.constData()),
- qRegisterMetaType<QQmlListProperty<T> >(listName.constData()),
+ qRegisterNormalizedMetaType<T *>(pointerName.constData()),
+ qRegisterNormalizedMetaType<QQmlListProperty<T> >(listName.constData()),
sizeof(T), QQmlPrivate::createInto<T>,
QString(),
QQmlPrivate::RegisterInterface qmlInterface = {
0,
- qRegisterMetaType<T *>(pointerName.constData()),
- qRegisterMetaType<QQmlListProperty<T> >(listName.constData()),
+ qRegisterNormalizedMetaType<T *>(pointerName.constData()),
+ qRegisterNormalizedMetaType<QQmlListProperty<T> >(listName.constData()),
qobject_interface_iid<T *>()
};
int qmlRegisterCustomType(const char *uri, int versionMajor, int versionMinor,
const char *qmlName, QQmlCustomParser *parser)
{
- QByteArray name(T::staticMetaObject.className());
-
- QByteArray pointerName(name + '*');
- QByteArray listName("QQmlListProperty<" + name + '>');
+ QML_GETTYPENAMES
QQmlPrivate::RegisterType type = {
0,
- qRegisterMetaType<T *>(pointerName.constData()),
- qRegisterMetaType<QQmlListProperty<T> >(listName.constData()),
+ qRegisterNormalizedMetaType<T *>(pointerName.constData()),
+ qRegisterNormalizedMetaType<QQmlListProperty<T> >(listName.constData()),
sizeof(T), QQmlPrivate::createInto<T>,
QString(),
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()
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
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;
}