diff options
-rw-r--r-- | src/corelib/kernel/qmetaobject.cpp | 4 | ||||
-rw-r--r-- | src/corelib/kernel/qobject.cpp | 8 | ||||
-rw-r--r-- | src/corelib/kernel/qobject.h | 10 | ||||
-rw-r--r-- | src/corelib/kernel/qobject_p.h | 17 | ||||
-rw-r--r-- | src/tools/moc/generator.cpp | 2 |
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()); // |