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
Aaron Kennedy 2012-05-17 11:02:59 +01:00 committed by Qt by Nokia
parent 6d7b003ac8
commit 276a86592a
5 changed files with 29 additions and 14 deletions

View File

@ -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);
}

View File

@ -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);

View File

@ -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;
};

View File

@ -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

View File

@ -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());
//