summaryrefslogtreecommitdiffstats
path: root/src/corelib/kernel/qmetatype.h
diff options
context:
space:
mode:
authorJędrzej Nowacki <jedrzej.nowacki@nokia.com>2012-05-22 13:48:22 +0200
committerQt by Nokia <qt-info@nokia.com>2012-06-12 04:30:05 +0200
commit3df316e9615027d9384cef81ac6cbfa2f9f81f01 (patch)
treed3588c99ffeb729142f8b9b6c80a2f5d65558ac0 /src/corelib/kernel/qmetatype.h
parent778e2b3bf5c29f2bab13e79400280fe86c6d2226 (diff)
Avoid a type name normalization during auto-registration.
Containers are auto-registered and use normalized names. Change-Id: Id65c3940401f69436929220e1f6a971135e147ed Reviewed-by: Stephen Kelly <stephen.kelly@kdab.com>
Diffstat (limited to 'src/corelib/kernel/qmetatype.h')
-rw-r--r--src/corelib/kernel/qmetatype.h44
1 files changed, 38 insertions, 6 deletions
diff --git a/src/corelib/kernel/qmetatype.h b/src/corelib/kernel/qmetatype.h
index 74702540f2..005d2b9f7a 100644
--- a/src/corelib/kernel/qmetatype.h
+++ b/src/corelib/kernel/qmetatype.h
@@ -523,6 +523,9 @@ int qRegisterNormalizedMetaType(const QT_PREPEND_NAMESPACE(QByteArray) &normaliz
#endif
)
{
+#ifndef QT_NO_QOBJECT
+ Q_ASSERT_X(normalizedTypeName == QMetaObject::normalizedType(normalizedTypeName.constData()), "qRegisterNormalizedMetaType", "qRegisterNormalizedMetaType was called with a not normalized type name, please call qRegisterMetaType instead.");
+#endif
const int typedefOf = dummy ? -1 : QtPrivate::QMetaTypeIdHelper<T>::qt_metatype_id();
if (typedefOf != -1)
return QMetaType::registerNormalizedTypedef(normalizedTypeName, typedefOf);
@@ -604,8 +607,9 @@ struct QMetaTypeIdQObject<T*, /* isPointerToTypeDerivedFromQObject */ true>
const int len = int(strlen(T::staticMetaObject.className()));
QVarLengthArray<char, 16> classNameStar;
classNameStar.append(T::staticMetaObject.className(), len);
- classNameStar.append("*\0", 2);
- metatype_id.storeRelease(qRegisterMetaType<T*>(classNameStar.constData(),
+ classNameStar.append('*');
+ metatype_id.storeRelease(qRegisterNormalizedMetaType<T*>( \
+ QByteArray(classNameStar.constData(), classNameStar.size()),
reinterpret_cast<T**>(quintptr(-1))));
}
return metatype_id.loadAcquire();
@@ -691,9 +695,21 @@ struct QMetaTypeId< SINGLE_ARG_TEMPLATE<T> > \
static int qt_metatype_id() \
{ \
static QBasicAtomicInt metatype_id = Q_BASIC_ATOMIC_INITIALIZER(0); \
- if (!metatype_id.load()) \
- metatype_id.storeRelease(qRegisterMetaType< SINGLE_ARG_TEMPLATE<T> >( QByteArray(QByteArray(#SINGLE_ARG_TEMPLATE "<") + QMetaType::typeName(qMetaTypeId<T>()) + ">").constData(), \
+ if (!metatype_id.load()) { \
+ QVarLengthArray<char, 24> name; \
+ name.append(#SINGLE_ARG_TEMPLATE, sizeof(#SINGLE_ARG_TEMPLATE) - 1); \
+ name.append('<'); \
+ const char *tName = QMetaType::typeName(qMetaTypeId<T>()); \
+ Q_ASSERT(tName); \
+ name.append(tName, strlen(tName)); \
+ if (name.last() == '>') \
+ name.append(' '); \
+ name.append('>'); \
+ metatype_id.storeRelease( \
+ qRegisterNormalizedMetaType< SINGLE_ARG_TEMPLATE<T> >( \
+ QByteArray(name.constData(), name.size()), \
reinterpret_cast< SINGLE_ARG_TEMPLATE<T> *>(quintptr(-1)))); \
+ } \
return metatype_id.loadAcquire(); \
} \
};
@@ -708,9 +724,25 @@ struct QMetaTypeId< DOUBLE_ARG_TEMPLATE<T, U> > \
static int qt_metatype_id() \
{ \
static QBasicAtomicInt metatype_id = Q_BASIC_ATOMIC_INITIALIZER(0); \
- if (!metatype_id.load()) \
- metatype_id.storeRelease(qRegisterMetaType< DOUBLE_ARG_TEMPLATE<T, U> >( QByteArray(QByteArray(#DOUBLE_ARG_TEMPLATE "<") + QMetaType::typeName(qMetaTypeId<T>()) + ", " + QMetaType::typeName(qMetaTypeId<U>()) + ">").constData(), \
+ if (!metatype_id.load()) {\
+ QVarLengthArray<char, 24> name; \
+ name.append(#DOUBLE_ARG_TEMPLATE, sizeof(#DOUBLE_ARG_TEMPLATE) - 1); \
+ name.append('<'); \
+ const char *tName = QMetaType::typeName(qMetaTypeId<T>()); \
+ Q_ASSERT(tName); \
+ name.append(tName, strlen(tName)); \
+ name.append(','); \
+ const char *uName = QMetaType::typeName(qMetaTypeId<U>()); \
+ Q_ASSERT(uName); \
+ name.append(uName, strlen(uName)); \
+ if (name.last() == '>') \
+ name.append(' '); \
+ name.append('>'); \
+ metatype_id.storeRelease(\
+ qRegisterNormalizedMetaType< DOUBLE_ARG_TEMPLATE<T, U> >(\
+ QByteArray(name.constData(), name.size()), \
reinterpret_cast< DOUBLE_ARG_TEMPLATE<T, U> *>(quintptr(-1)))); \
+ }\
return metatype_id.loadAcquire(); \
} \
};