Encapsulate the dynamic meta object pointer
This change allows us to delay creating the actual meta object until it is actually required. Change-Id: I1c4a4226bd82fa606b206dd60322f49b49c32463 Reviewed-by: Kent Hansen <kent.hansen@nokia.com> Reviewed-by: Lars Knoll <lars.knoll@nokia.com>bb10
parent
6d7b003ac8
commit
276a86592a
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -286,12 +286,23 @@ private:
|
|||
|
||||
void Q_CORE_EXPORT qDeleteInEventHandler(QObject *o);
|
||||
|
||||
|
||||
struct Q_CORE_EXPORT QAbstractDynamicMetaObject : public QMetaObject
|
||||
struct QAbstractDynamicMetaObject;
|
||||
struct Q_CORE_EXPORT QDynamicMetaObjectData
|
||||
{
|
||||
virtual ~QAbstractDynamicMetaObject() {}
|
||||
virtual int metaCall(QMetaObject::Call, int _id, void **) { return _id; }
|
||||
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 QDynamicMetaObjectData, public QMetaObject
|
||||
{
|
||||
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
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
|
||||
//
|
||||
|
|
|
|||
Loading…
Reference in New Issue