From 31d8ecfe3b6b5ab27e4bb36aeeeae917e0aabc23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C4=99drzej=20Nowacki?= Date: Tue, 13 Dec 2011 16:12:32 +0100 Subject: Make QMetaTypeInterface POD. QMetaTypeInterface has to be POD because it is constructed in a static array. Constructors in POD types are not allowed so we will use a macro instead. Change-Id: Iab9ae776dfe4dcd7148558f02d6181c5917aa5c3 Reviewed-by: Thiago Macieira --- src/corelib/kernel/qmetatype.cpp | 12 +++++++++ src/corelib/kernel/qmetatype_p.h | 45 ++++++++++++++-------------------- src/gui/kernel/qguivariant.cpp | 2 +- src/widgets/kernel/qwidgetsvariant.cpp | 2 +- 4 files changed, 33 insertions(+), 28 deletions(-) diff --git a/src/corelib/kernel/qmetatype.cpp b/src/corelib/kernel/qmetatype.cpp index 76537c79cb..d5a22ef07d 100644 --- a/src/corelib/kernel/qmetatype.cpp +++ b/src/corelib/kernel/qmetatype.cpp @@ -297,6 +297,14 @@ public: int alias; }; +namespace +{ +union CheckThatItIsPod +{ // This should break if QMetaTypeInterface is not a POD type + QMetaTypeInterface iface; +}; +} + Q_DECLARE_TYPEINFO(QCustomTypeInfo, Q_MOVABLE_TYPE); Q_GLOBAL_STATIC(QVector, customTypes) Q_GLOBAL_STATIC(QReadWriteLock, customTypesLock) @@ -454,6 +462,10 @@ int QMetaType::registerType(const char *typeName, Deleter deleter, inf.typeName = normalizedTypeName; inf.creator = creator; inf.deleter = deleter; +#ifndef QT_NO_DATASTREAM + inf.loadOp = 0; + inf.saveOp = 0; +#endif inf.alias = -1; inf.constructor = constructor; inf.destructor = destructor; diff --git a/src/corelib/kernel/qmetatype_p.h b/src/corelib/kernel/qmetatype_p.h index 92311afc8e..448c6ded13 100644 --- a/src/corelib/kernel/qmetatype_p.h +++ b/src/corelib/kernel/qmetatype_p.h @@ -113,7 +113,7 @@ QT_FOR_EACH_STATIC_WIDGETS_CLASS(QT_DECLARE_WIDGETS_MODULE_TYPES_ITER) class QMetaTypeInterface { -private: +public: template struct Impl { static void *creator(const T *t) @@ -140,31 +140,6 @@ private: return new (where) T; } }; -public: - template - explicit QMetaTypeInterface(T *) - : creator(reinterpret_cast(Impl::creator)) - , deleter(reinterpret_cast(Impl::deleter)) - #ifndef QT_NO_DATASTREAM - , saveOp(reinterpret_cast(Impl::saver)) - , loadOp(reinterpret_cast(Impl::loader)) - #endif - , constructor(reinterpret_cast(Impl::constructor)) - , destructor(reinterpret_cast(Impl::destructor)) - , size(sizeof(T)) - {} - - QMetaTypeInterface() - : creator(0) - , deleter(0) - #ifndef QT_NO_DATASTREAM - , saveOp(0) - , loadOp(0) - #endif - , constructor(0) - , destructor(0) - , size(0) - {} QMetaType::Creator creator; QMetaType::Deleter deleter; @@ -177,6 +152,24 @@ public: int size; }; +#ifndef QT_NO_DATASTREAM +# define QT_METATYPE_INTERFACE_INIT_DATASTREAM_IMPL(Type) \ + /*saveOp*/(reinterpret_cast(QMetaTypeInterface::Impl::saver)), \ + /*loadOp*/(reinterpret_cast(QMetaTypeInterface::Impl::loader)), +#else +# define QT_METATYPE_INTERFACE_INIT_DATASTREAM_IMPL(Type) +#endif + +#define QT_METATYPE_INTERFACE_INIT(Type) \ +{ \ + /*creator*/(reinterpret_cast(QMetaTypeInterface::Impl::creator)), \ + /*deleter*/(reinterpret_cast(QMetaTypeInterface::Impl::deleter)), \ + QT_METATYPE_INTERFACE_INIT_DATASTREAM_IMPL(Type) \ + /*constructor*/(reinterpret_cast(QMetaTypeInterface::Impl::constructor)), \ + /*destructor*/(reinterpret_cast(QMetaTypeInterface::Impl::destructor)), \ + /*size*/(sizeof(Type)) \ +} + QT_END_NAMESPACE #endif // QMETATYPE_P_H diff --git a/src/gui/kernel/qguivariant.cpp b/src/gui/kernel/qguivariant.cpp index 3b60f29e83..a7f2f83aab 100644 --- a/src/gui/kernel/qguivariant.cpp +++ b/src/gui/kernel/qguivariant.cpp @@ -477,7 +477,7 @@ const QVariant::Handler qt_gui_variant_handler = { extern Q_CORE_EXPORT const QMetaTypeInterface *qMetaTypeGuiHelper; #define QT_IMPL_METATYPEINTERFACE_GUI_TYPES(MetaTypeName, MetaTypeId, RealName) \ - QMetaTypeInterface(static_cast(0)), + QT_METATYPE_INTERFACE_INIT(RealName), static const QMetaTypeInterface qVariantGuiHelper[] = { QT_FOR_EACH_STATIC_GUI_CLASS(QT_IMPL_METATYPEINTERFACE_GUI_TYPES) diff --git a/src/widgets/kernel/qwidgetsvariant.cpp b/src/widgets/kernel/qwidgetsvariant.cpp index 18fec508ea..97a8238ca7 100644 --- a/src/widgets/kernel/qwidgetsvariant.cpp +++ b/src/widgets/kernel/qwidgetsvariant.cpp @@ -141,7 +141,7 @@ static const QVariant::Handler widgets_handler = { extern Q_CORE_EXPORT const QMetaTypeInterface *qMetaTypeWidgetsHelper; #define QT_IMPL_METATYPEINTERFACE_WIDGETS_TYPES(MetaTypeName, MetaTypeId, RealName) \ - QMetaTypeInterface(static_cast(0)), + QT_METATYPE_INTERFACE_INIT(RealName), static const QMetaTypeInterface qVariantWidgetsHelper[] = { QT_FOR_EACH_STATIC_WIDGETS_CLASS(QT_IMPL_METATYPEINTERFACE_WIDGETS_TYPES) -- cgit v1.2.3