summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/corelib/kernel/qmetatype.cpp9
-rw-r--r--src/corelib/kernel/qmetatype.h26
-rw-r--r--src/dbus/qdbusmetaobject.cpp3
3 files changed, 30 insertions, 8 deletions
diff --git a/src/corelib/kernel/qmetatype.cpp b/src/corelib/kernel/qmetatype.cpp
index 8c2b5a8665..a735e6dc4c 100644
--- a/src/corelib/kernel/qmetatype.cpp
+++ b/src/corelib/kernel/qmetatype.cpp
@@ -460,7 +460,7 @@ static int qMetaTypeCustomType_unlocked(const char *typeName, int length)
int QMetaType::registerType(const char *typeName, Deleter deleter,
Creator creator)
{
- return registerType(typeName, deleter, creator, qMetaTypeDestructHelper<void>, qMetaTypeConstructHelper<void>, 0, TypeFlags());
+ return registerType(typeName, deleter, creator, qMetaTypeDestructHelper<void>, qMetaTypeConstructHelper<void>, 0, TypeFlags(), 0);
}
/*! \internal
@@ -475,7 +475,7 @@ int QMetaType::registerType(const char *typeName, Deleter deleter,
Creator creator,
Destructor destructor,
Constructor constructor,
- int size, TypeFlags flags)
+ int size, TypeFlags flags, const QMetaObject *metaObject)
{
QVector<QCustomTypeInfo> *ct = customTypes();
if (!ct || !typeName || !deleter || !creator || !destructor || !constructor)
@@ -1675,7 +1675,8 @@ QMetaType QMetaType::typeInfo(const int type)
, typeInfo.info.destructor
, typeInfo.info.size
, typeInfo.info.flags
- , type)
+ , type
+ , 0)
: QMetaType(UnknownType);
}
@@ -1708,6 +1709,7 @@ QMetaType::QMetaType(const QMetaType &other)
, m_typeFlags(other.m_typeFlags)
, m_extensionFlags(other.m_extensionFlags)
, m_typeId(other.m_typeId)
+ , m_metaObject(other.m_metaObject)
{}
QMetaType &QMetaType::operator =(const QMetaType &other)
@@ -1723,6 +1725,7 @@ QMetaType &QMetaType::operator =(const QMetaType &other)
m_extensionFlags = other.m_extensionFlags;
m_extension = other.m_extension; // space reserved for future use
m_typeId = other.m_typeId;
+ m_metaObject = other.m_metaObject;
return *this;
}
diff --git a/src/corelib/kernel/qmetatype.h b/src/corelib/kernel/qmetatype.h
index aa73785dac..39d58913db 100644
--- a/src/corelib/kernel/qmetatype.h
+++ b/src/corelib/kernel/qmetatype.h
@@ -180,6 +180,7 @@ QT_BEGIN_NAMESPACE
class QDataStream;
class QMetaTypeInterface;
+class QMetaObject;
class Q_CORE_EXPORT QMetaType {
enum ExtensionFlag { NoExtensionFlags,
@@ -238,7 +239,8 @@ public:
Destructor destructor,
Constructor constructor,
int size,
- QMetaType::TypeFlags flags);
+ QMetaType::TypeFlags flags,
+ const QMetaObject *metaObject);
static int registerTypedef(const char *typeName, int aliasId);
static int type(const char *typeName);
static const char *typeName(int type);
@@ -282,7 +284,8 @@ private:
Destructor destructor,
uint sizeOf,
uint theTypeFlags,
- int typeId);
+ int typeId,
+ const QMetaObject *metaObject);
QMetaType(const QMetaType &other);
QMetaType &operator =(const QMetaType &);
inline bool isExtended(const ExtensionFlag flag) const { return m_extensionFlags & flag; }
@@ -308,6 +311,7 @@ private:
uint m_typeFlags;
uint m_extensionFlags;
int m_typeId;
+ const QMetaObject *m_metaObject; // Placeholder for Qt 5.1 feature.
};
#undef QT_DEFINE_METATYPE_ID
@@ -409,6 +413,17 @@ namespace QtPrivate
Q_STATIC_ASSERT_X(sizeof(T), "Type argument of Q_DECLARE_METATYPE(T*) must be fully defined");
enum { Value = sizeof(checkType(static_cast<T*>(0))) == sizeof(yes_type) };
};
+
+ template<typename T, bool = IsPointerToTypeDerivedFromQObject<T>::Value>
+ struct MetaObjectForType
+ {
+ static inline const QMetaObject *value() { return 0; }
+ };
+ template<typename T>
+ struct MetaObjectForType<T*, /* isPointerToTypeDerivedFromQObject = */ true>
+ {
+ static inline const QMetaObject *value() { return &T::staticMetaObject; }
+ };
}
template <typename T, bool = QtPrivate::IsPointerToTypeDerivedFromQObject<T>::Value>
@@ -477,7 +492,8 @@ int qRegisterMetaType(const char *typeName
qMetaTypeDestructHelper<T>,
qMetaTypeConstructHelper<T>,
sizeof(T),
- flags);
+ flags,
+ QtPrivate::MetaObjectForType<T>::value());
}
#ifndef QT_NO_DATASTREAM
@@ -659,7 +675,8 @@ inline QMetaType::QMetaType(const ExtensionFlag extensionFlags, const QMetaTypeI
Destructor destructor,
uint size,
uint theTypeFlags,
- int typeId)
+ int typeId,
+ const QMetaObject *metaObject)
: m_creator(creator)
, m_deleter(deleter)
, m_saveOp(saveOp)
@@ -670,6 +687,7 @@ inline QMetaType::QMetaType(const ExtensionFlag extensionFlags, const QMetaTypeI
, m_typeFlags(theTypeFlags)
, m_extensionFlags(extensionFlags)
, m_typeId(typeId)
+ , m_metaObject(metaObject)
{
if (Q_UNLIKELY(isExtended(CtorEx) || typeId == QMetaType::Void))
ctor(info);
diff --git a/src/dbus/qdbusmetaobject.cpp b/src/dbus/qdbusmetaobject.cpp
index ce8146f639..a6e5f96eca 100644
--- a/src/dbus/qdbusmetaobject.cpp
+++ b/src/dbus/qdbusmetaobject.cpp
@@ -189,7 +189,8 @@ QDBusMetaObjectGenerator::findType(const QByteArray &signature,
QDBusRawTypeHandler::destruct,
QDBusRawTypeHandler::construct,
sizeof(void *),
- QMetaType::MovableType);
+ QMetaType::MovableType,
+ 0);
}
result.name = typeName;