summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/corelib/kernel/qmetaobject.cpp4
-rw-r--r--src/corelib/kernel/qobject.cpp8
-rw-r--r--src/corelib/kernel/qobject.h10
-rw-r--r--src/corelib/kernel/qobject_p.h17
-rw-r--r--src/tools/moc/generator.cpp2
5 files changed, 28 insertions, 13 deletions
diff --git a/src/corelib/kernel/qmetaobject.cpp b/src/corelib/kernel/qmetaobject.cpp
index c91cf60cc9..5132d97ff3 100644
--- a/src/corelib/kernel/qmetaobject.cpp
+++ b/src/corelib/kernel/qmetaobject.cpp
@@ -300,8 +300,8 @@ int QMetaObject::static_metacall(Call cl, int idx, void **argv) const
*/
int QMetaObject::metacall(QObject *object, Call cl, int idx, void **argv)
{
- if (QMetaObject *mo = object->d_ptr->metaObject)
- return static_cast<QAbstractDynamicMetaObject*>(mo)->metaCall(cl, idx, argv);
+ if (object->d_ptr->metaObject)
+ return object->d_ptr->metaObject->metaCall(object, cl, idx, argv);
else
return object->qt_metacall(cl, idx, argv);
}
diff --git a/src/corelib/kernel/qobject.cpp b/src/corelib/kernel/qobject.cpp
index 29a4767d28..ca103f0f3e 100644
--- a/src/corelib/kernel/qobject.cpp
+++ b/src/corelib/kernel/qobject.cpp
@@ -187,6 +187,11 @@ int (*QAbstractDeclarativeData::receivers)(QAbstractDeclarativeData *, const QO
QObjectData::~QObjectData() {}
+QMetaObject *QObjectData::dynamicMetaObject() const
+{
+ return metaObject->toDynamicMetaObject(q_ptr);
+}
+
QObjectPrivate::QObjectPrivate(int version)
: threadData(0), connectionLists(0), senders(0), currentSender(0), currentChildBeingDeleted(0)
{
@@ -227,7 +232,8 @@ QObjectPrivate::~QObjectPrivate()
threadData->deref();
- delete static_cast<QAbstractDynamicMetaObject*>(metaObject);
+ if (metaObject) metaObject->objectDestroyed(q_ptr);
+
#ifndef QT_NO_USERDATA
if (extraData)
qDeleteAll(extraData->userData);
diff --git a/src/corelib/kernel/qobject.h b/src/corelib/kernel/qobject.h
index f69a4395f9..bce0c96ac1 100644
--- a/src/corelib/kernel/qobject.h
+++ b/src/corelib/kernel/qobject.h
@@ -79,6 +79,7 @@ class QRegularExpression;
#ifndef QT_NO_USERDATA
class QObjectUserData;
#endif
+class QDynamicMetaObjectData;
typedef QList<QObject*> QObjectList;
@@ -90,11 +91,7 @@ Q_CORE_EXPORT void qt_qFindChildren_helper(const QObject *parent, const QRegular
const QMetaObject &mo, QList<void *> *list, Qt::FindChildOptions options);
Q_CORE_EXPORT QObject *qt_qFindChild_helper(const QObject *parent, const QString &name, const QMetaObject &mo, Qt::FindChildOptions options);
-class
-#if defined(__INTEL_COMPILER) && defined(Q_OS_WIN)
-Q_CORE_EXPORT
-#endif
-QObjectData {
+class Q_CORE_EXPORT QObjectData {
public:
virtual ~QObjectData() = 0;
QObject *q_ptr;
@@ -110,7 +107,8 @@ public:
uint isWindow : 1; //for QWindow
uint unused : 25;
int postedEvents;
- QMetaObject *metaObject; // assert dynamic
+ QDynamicMetaObjectData *metaObject;
+ QMetaObject *dynamicMetaObject() const;
};
diff --git a/src/corelib/kernel/qobject_p.h b/src/corelib/kernel/qobject_p.h
index f650a301a7..8dd42d40b6 100644
--- a/src/corelib/kernel/qobject_p.h
+++ b/src/corelib/kernel/qobject_p.h
@@ -286,12 +286,23 @@ private:
void Q_CORE_EXPORT qDeleteInEventHandler(QObject *o);
+struct QAbstractDynamicMetaObject;
+struct Q_CORE_EXPORT QDynamicMetaObjectData
+{
+ virtual ~QDynamicMetaObjectData() {}
+ virtual void objectDestroyed(QObject *) { delete this; }
+
+ virtual QAbstractDynamicMetaObject *toDynamicMetaObject(QObject *) = 0;
+ virtual int metaCall(QObject *, QMetaObject::Call, int _id, void **) = 0;
+};
-struct Q_CORE_EXPORT QAbstractDynamicMetaObject : public QMetaObject
+struct Q_CORE_EXPORT QAbstractDynamicMetaObject : public QDynamicMetaObjectData, public QMetaObject
{
- virtual ~QAbstractDynamicMetaObject() {}
- virtual int metaCall(QMetaObject::Call, int _id, void **) { return _id; }
+ virtual QAbstractDynamicMetaObject *toDynamicMetaObject(QObject *) { return this; }
virtual int createProperty(const char *, const char *) { return -1; }
+ virtual int metaCall(QObject *, QMetaObject::Call c, int _id, void **a)
+ { return metaCall(c, _id, a); }
+ virtual int metaCall(QMetaObject::Call, int _id, void **) { return _id; } // Compat overload
};
QT_END_NAMESPACE
diff --git a/src/tools/moc/generator.cpp b/src/tools/moc/generator.cpp
index 5680dcba70..bcf70cbe91 100644
--- a/src/tools/moc/generator.cpp
+++ b/src/tools/moc/generator.cpp
@@ -449,7 +449,7 @@ void Generator::generateCode()
if (!cdef->hasQObject)
return;
- fprintf(out, "\nconst QMetaObject *%s::metaObject() const\n{\n return QObject::d_ptr->metaObject ? QObject::d_ptr->metaObject : &staticMetaObject;\n}\n",
+ fprintf(out, "\nconst QMetaObject *%s::metaObject() const\n{\n return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject;\n}\n",
cdef->qualified.constData());
//