From 67f58040ea10255af2c09149f16ce683f00dc7a2 Mon Sep 17 00:00:00 2001 From: Olivier Goffart Date: Fri, 13 Jan 2012 20:09:19 +0100 Subject: Remove QMetaObjectExtraData and put everything into QMetaObject MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit QMetaObjectExtraData was added when support for QMetaObject::newInstance was added. One needed a place to put the pointer to static_metacall in the QMetaObject. But as we break binary compatibility, one can change the size of QMetaObject, and put everything back inside QMetaObject's own structure. Meaning it is not required anymore to have one QMetaObjectExtraData instance per QMetaObject anymore. Change-Id: If0b8f586cbaf633eed10045adee3ba3366826c86 Reviewed-by: Bradley T. Hughes Reviewed-by: Kent Hansen Reviewed-by: Jędrzej Nowacki --- src/corelib/kernel/qmetaobject.cpp | 14 +++---- src/corelib/kernel/qmetaobjectbuilder.cpp | 44 +++++++--------------- src/corelib/kernel/qmetaobjectbuilder_p.h | 2 +- src/corelib/kernel/qobject.cpp | 3 +- src/corelib/kernel/qobjectdefs.h | 19 +++------- src/corelib/statemachine/qstatemachine.cpp | 6 +-- src/dbus/qdbusabstractadaptor.cpp | 6 +-- src/dbus/qdbusmetaobject.cpp | 4 ++ src/tools/moc/generator.cpp | 30 +++++---------- src/tools/moc/outputrevision.h | 2 +- .../qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp | 23 ++--------- tests/auto/tools/moc/tst_moc.cpp | 5 +-- 12 files changed, 46 insertions(+), 112 deletions(-) diff --git a/src/corelib/kernel/qmetaobject.cpp b/src/corelib/kernel/qmetaobject.cpp index 359dbfcf23..4414393d37 100644 --- a/src/corelib/kernel/qmetaobject.cpp +++ b/src/corelib/kernel/qmetaobject.cpp @@ -288,11 +288,10 @@ QObject *QMetaObject::newInstance(QGenericArgument val0, */ int QMetaObject::static_metacall(Call cl, int idx, void **argv) const { - const QMetaObjectExtraData *extra = reinterpret_cast(d.extradata); Q_ASSERT(priv(d.data)->revision >= 6); - if (!extra || !extra->static_metacall) + if (!d.static_metacall) return 0; - extra->static_metacall(0, cl, idx, argv); + d.static_metacall(0, cl, idx, argv); return -1; } @@ -863,11 +862,9 @@ static const QMetaObject *QMetaObject_findMetaObject(const QMetaObject *self, co while (self) { if (strcmp(rawStringData(self, 0), name) == 0) return self; - if (self->d.extradata) { - const QMetaObject **e; + if (self->d.relatedMetaObjects) { Q_ASSERT(priv(self->d.data)->revision >= 2); - const QMetaObjectExtraData *extra = (const QMetaObjectExtraData*)(self->d.extradata); - e = extra->objects; + const QMetaObject **e = self->d.relatedMetaObjects; if (e) { while (*e) { if (const QMetaObject *m =QMetaObject_findMetaObject((*e), name)) @@ -2024,8 +2021,7 @@ bool QMetaMethod::invoke(QObject *object, int idx_relative = ((handle - priv(mobj->d.data)->methodData) / 5); int idx_offset = mobj->methodOffset(); Q_ASSERT(QMetaObjectPrivate::get(mobj)->revision >= 6); - QObjectPrivate::StaticMetaCallFunction callFunction = mobj->d.extradata - ? reinterpret_cast(mobj->d.extradata)->static_metacall : 0; + QObjectPrivate::StaticMetaCallFunction callFunction = mobj->d.static_metacall; if (connectionType == Qt::DirectConnection) { if (callFunction) { diff --git a/src/corelib/kernel/qmetaobjectbuilder.cpp b/src/corelib/kernel/qmetaobjectbuilder.cpp index 1dda9f2f05..7736181463 100644 --- a/src/corelib/kernel/qmetaobjectbuilder.cpp +++ b/src/corelib/kernel/qmetaobjectbuilder.cpp @@ -737,13 +737,8 @@ void QMetaObjectBuilder::addMetaObject } if ((members & RelatedMetaObjects) != 0) { - const QMetaObject **objects; Q_ASSERT(priv(prototype->d.data)->revision >= 2); - const QMetaObjectExtraData *extra = (const QMetaObjectExtraData *)(prototype->d.extradata); - if (extra) - objects = extra->objects; - else - objects = 0; + const QMetaObject **objects = prototype->d.relatedMetaObjects; if (objects) { while (*objects != 0) { addRelatedMetaObject(*objects); @@ -754,10 +749,8 @@ void QMetaObjectBuilder::addMetaObject if ((members & StaticMetacall) != 0) { Q_ASSERT(priv(prototype->d.data)->revision >= 6); - const QMetaObjectExtraData *extra = - (const QMetaObjectExtraData *)(prototype->d.extradata); - if (extra && extra->static_metacall) - setStaticMetacallFunction(extra->static_metacall); + if (prototype->d.static_metacall) + setStaticMetacallFunction(prototype->d.static_metacall); } } @@ -1150,7 +1143,7 @@ static int aggregateParameterCount(const QList &metho // Build a QMetaObject in "buf" based on the information in "d". // If "buf" is null, then return the number of bytes needed to // build the QMetaObject. Returns -1 if the metaobject if -// relocatable is set, but the metaobject contains extradata. +// relocatable is set, but the metaobject contains relatedMetaObjects. static int buildMetaObject(QMetaObjectBuilderPrivate *d, char *buf, int expectedSize, bool relocatable) { @@ -1174,7 +1167,9 @@ static int buildMetaObject(QMetaObjectBuilderPrivate *d, char *buf, ALIGN(size, int); if (buf) { if (!relocatable) meta->d.superdata = d->superClass; + meta->d.relatedMetaObjects = 0; meta->d.extradata = 0; + meta->d.static_metacall = d->staticMetacallFunction; } // Populate the QMetaObjectPrivate structure. @@ -1446,30 +1441,18 @@ static int buildMetaObject(QMetaObjectBuilderPrivate *d, char *buf, if (buf) data[enumIndex] = 0; - // Create the extradata block if we need one. - if (d->relatedMetaObjects.size() > 0 || d->staticMetacallFunction) { - ALIGN(size, QMetaObject **); - ALIGN(size, QMetaObjectBuilder::StaticMetacallFunction); - QMetaObjectExtraData *extra = - reinterpret_cast(buf + size); - size += sizeof(QMetaObjectExtraData); + // Create the relatedMetaObjects block if we need one. + if (d->relatedMetaObjects.size() > 0) { ALIGN(size, QMetaObject *); const QMetaObject **objects = reinterpret_cast(buf + size); if (buf) { - if (d->relatedMetaObjects.size() > 0) { - extra->objects = objects; - for (index = 0; index < d->relatedMetaObjects.size(); ++index) - objects[index] = d->relatedMetaObjects[index]; - objects[index] = 0; - } else { - extra->objects = 0; - } - extra->static_metacall = d->staticMetacallFunction; - meta->d.extradata = reinterpret_cast(extra); + meta->d.relatedMetaObjects = objects; + for (index = 0; index < d->relatedMetaObjects.size(); ++index) + objects[index] = d->relatedMetaObjects[index]; + objects[index] = 0; } - if (d->relatedMetaObjects.size() > 0) - size += sizeof(QMetaObject *) * (d->relatedMetaObjects.size() + 1); + size += sizeof(QMetaObject *) * (d->relatedMetaObjects.size() + 1); } // Align the final size and return it. @@ -1552,6 +1535,7 @@ void QMetaObjectBuilder::fromRelocatableData(QMetaObject *output, output->d.stringdata = reinterpret_cast(buf + stringdataOffset); output->d.data = reinterpret_cast(buf + dataOffset); output->d.extradata = 0; + output->d.relatedMetaObjects = 0; } /*! diff --git a/src/corelib/kernel/qmetaobjectbuilder_p.h b/src/corelib/kernel/qmetaobjectbuilder_p.h index 4d766a9197..7c18298d35 100644 --- a/src/corelib/kernel/qmetaobjectbuilder_p.h +++ b/src/corelib/kernel/qmetaobjectbuilder_p.h @@ -165,7 +165,7 @@ public: int indexOfEnumerator(const QByteArray& name); int indexOfClassInfo(const QByteArray& name); - typedef QMetaObjectExtraData::StaticMetacallFunction StaticMetacallFunction; + typedef void (*StaticMetacallFunction)(QObject *, QMetaObject::Call, int, void **); QMetaObjectBuilder::StaticMetacallFunction staticMetacallFunction() const; void setStaticMetacallFunction(QMetaObjectBuilder::StaticMetacallFunction value); diff --git a/src/corelib/kernel/qobject.cpp b/src/corelib/kernel/qobject.cpp index ecf58a00ea..35b46b2823 100644 --- a/src/corelib/kernel/qobject.cpp +++ b/src/corelib/kernel/qobject.cpp @@ -2949,8 +2949,7 @@ QObjectPrivate::Connection *QMetaObjectPrivate::connect(const QObject *sender, i int method_offset = rmeta ? rmeta->methodOffset() : 0; Q_ASSERT(!rmeta || QMetaObjectPrivate::get(rmeta)->revision >= 6); QObjectPrivate::StaticMetaCallFunction callFunction = - (rmeta && rmeta->d.extradata) - ? reinterpret_cast(rmeta->d.extradata)->static_metacall : 0; + rmeta ? rmeta->d.static_metacall : 0; QOrderedMutexLocker locker(signalSlotLock(sender), signalSlotLock(receiver)); diff --git a/src/corelib/kernel/qobjectdefs.h b/src/corelib/kernel/qobjectdefs.h index a52961bab7..cc442457b0 100644 --- a/src/corelib/kernel/qobjectdefs.h +++ b/src/corelib/kernel/qobjectdefs.h @@ -57,7 +57,7 @@ struct QByteArrayData; class QString; #ifndef Q_MOC_OUTPUT_REVISION -#define Q_MOC_OUTPUT_REVISION 65 +#define Q_MOC_OUTPUT_REVISION 66 #endif // The following macros are our "extensions" to C++ @@ -160,7 +160,6 @@ public: \ QT_TR_FUNCTIONS \ virtual int qt_metacall(QMetaObject::Call, int, void **); \ private: \ - Q_DECL_HIDDEN static const QMetaObjectExtraData staticMetaObjectExtraData; \ Q_DECL_HIDDEN_STATIC_METACALL static void qt_static_metacall(QObject *, QMetaObject::Call, int, void **); /* tmake ignore Q_OBJECT */ @@ -453,7 +452,10 @@ struct Q_CORE_EXPORT QMetaObject const QMetaObject *superdata; const QByteArrayData *stringdata; const uint *data; - const void *extradata; + typedef void (*StaticMetacallFunction)(QObject *, QMetaObject::Call, int, void **); + StaticMetacallFunction static_metacall; + const QMetaObject **relatedMetaObjects; + void *extradata; //reserved for future use } d; }; @@ -481,17 +483,6 @@ public: #endif }; -typedef const QMetaObject& (*QMetaObjectAccessor)(); - -struct QMetaObjectExtraData -{ - const QMetaObject **objects; - - typedef void (*StaticMetacallFunction)(QObject *, QMetaObject::Call, int, void **); //from revision 6 - //typedef int (*StaticMetaCall)(QMetaObject::Call, int, void **); //used from revison 2 until revison 5 - StaticMetacallFunction static_metacall; -}; - inline const QMetaObject *QMetaObject::superClass() const { return d.superdata; } diff --git a/src/corelib/statemachine/qstatemachine.cpp b/src/corelib/statemachine/qstatemachine.cpp index 4bb000a646..b8f7954e33 100644 --- a/src/corelib/statemachine/qstatemachine.cpp +++ b/src/corelib/statemachine/qstatemachine.cpp @@ -2265,13 +2265,9 @@ void QSignalEventGenerator::qt_static_metacall(QObject *_o, QMetaObject::Call _c Q_UNUSED(_a); } -const QMetaObjectExtraData QSignalEventGenerator::staticMetaObjectExtraData = { - 0, qt_static_metacall -}; - const QMetaObject QSignalEventGenerator::staticMetaObject = { { &QObject::staticMetaObject, qt_meta_stringdata_QSignalEventGenerator.data, - qt_meta_data_QSignalEventGenerator, &staticMetaObjectExtraData } + qt_meta_data_QSignalEventGenerator, qt_static_metacall, 0, 0 } }; const QMetaObject *QSignalEventGenerator::metaObject() const diff --git a/src/dbus/qdbusabstractadaptor.cpp b/src/dbus/qdbusabstractadaptor.cpp index dda20cde04..39584c436c 100644 --- a/src/dbus/qdbusabstractadaptor.cpp +++ b/src/dbus/qdbusabstractadaptor.cpp @@ -395,13 +395,9 @@ void QDBusAdaptorConnector::qt_static_metacall(QObject *_o, QMetaObject::Call _c } } -const QMetaObjectExtraData QDBusAdaptorConnector::staticMetaObjectExtraData = { - 0, qt_static_metacall -}; - const QMetaObject QDBusAdaptorConnector::staticMetaObject = { { &QObject::staticMetaObject, qt_meta_stringdata_QDBusAdaptorConnector.data, - qt_meta_data_QDBusAdaptorConnector, &staticMetaObjectExtraData } + qt_meta_data_QDBusAdaptorConnector, qt_static_metacall, 0, 0 } }; const QMetaObject *QDBusAdaptorConnector::metaObject() const diff --git a/src/dbus/qdbusmetaobject.cpp b/src/dbus/qdbusmetaobject.cpp index 4fbf67a8b2..5570dac71d 100644 --- a/src/dbus/qdbusmetaobject.cpp +++ b/src/dbus/qdbusmetaobject.cpp @@ -542,6 +542,8 @@ void QDBusMetaObjectGenerator::write(QDBusMetaObject *obj) // put the metaobject together obj->d.data = uint_data; + obj->d.relatedMetaObjects = 0; + obj->d.static_metacall = 0; obj->d.extradata = 0; obj->d.stringdata = reinterpret_cast(string_data); obj->d.superdata = &QDBusAbstractInterface::staticMetaObject; @@ -564,6 +566,8 @@ void QDBusMetaObjectGenerator::writeWithoutXml(const QString &interface) stringdata[name.length()] = '\0'; d.data = reinterpret_cast(header); + d.relatedMetaObjects = 0; + d.static_metacall = 0; d.extradata = 0; d.stringdata = stringdata; d.superdata = &QDBusAbstractInterface::staticMetaObject; diff --git a/src/tools/moc/generator.cpp b/src/tools/moc/generator.cpp index 74cdc5874c..5680dcba70 100644 --- a/src/tools/moc/generator.cpp +++ b/src/tools/moc/generator.cpp @@ -415,22 +415,6 @@ void Generator::generateCode() fprintf(out, " 0\n};\n\n"); } - bool hasExtraData = (cdef->hasQObject && !isQt) || !extraList.isEmpty(); - if (hasExtraData) { - fprintf(out, "const QMetaObjectExtraData %s::staticMetaObjectExtraData = {\n ", - cdef->qualified.constData()); - if (extraList.isEmpty()) - fprintf(out, "0, "); - else - fprintf(out, "qt_meta_extradata_%s, ", qualifiedClassNameIdentifier.constData()); - - if (cdef->hasQObject && !isQt) - fprintf(out, " qt_static_metacall"); - else - fprintf(out, " 0"); - fprintf(out, " \n};\n\n"); - } - // // Finally create and initialize the static meta object // @@ -448,16 +432,20 @@ void Generator::generateCode() fprintf(out, "qt_meta_stringdata_%s.data,\n" " qt_meta_data_%s, ", qualifiedClassNameIdentifier.constData(), qualifiedClassNameIdentifier.constData()); - if (!hasExtraData) - fprintf(out, "0 }\n"); + if (cdef->hasQObject && !isQt) + fprintf(out, " qt_static_metacall, "); else - fprintf(out, "&staticMetaObjectExtraData }\n"); - fprintf(out, "};\n"); + fprintf(out, " 0, "); + + if (extraList.isEmpty()) + fprintf(out, "0, "); + else + fprintf(out, "qt_meta_extradata_%s, ", qualifiedClassNameIdentifier.constData()); + fprintf(out, "0}\n};\n\n"); if(isQt) return; - if (!cdef->hasQObject) return; diff --git a/src/tools/moc/outputrevision.h b/src/tools/moc/outputrevision.h index cff0f98fca..590728db6c 100644 --- a/src/tools/moc/outputrevision.h +++ b/src/tools/moc/outputrevision.h @@ -43,6 +43,6 @@ #define OUTPUTREVISION_H // if the output revision changes, you MUST change it in qobjectdefs.h too -enum { mocOutputRevision = 65 }; // moc format output revision +enum { mocOutputRevision = 66 }; // moc format output revision #endif // OUTPUTREVISION_H diff --git a/tests/auto/corelib/kernel/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp b/tests/auto/corelib/kernel/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp index 4b0a64ab54..8ae79e03a7 100644 --- a/tests/auto/corelib/kernel/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp +++ b/tests/auto/corelib/kernel/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp @@ -1316,25 +1316,8 @@ bool tst_QMetaObjectBuilder::sameMetaObject return false; } - const QMetaObject **objects1 = 0; - const QMetaObject **objects2 = 0; - if (meta1->d.data[0] == meta2->d.data[0] && meta1->d.data[0] >= 2) { - QMetaObjectExtraData *extra1 = (QMetaObjectExtraData *)(meta1->d.extradata); - QMetaObjectExtraData *extra2 = (QMetaObjectExtraData *)(meta2->d.extradata); - if (extra1 && !extra2) - return false; - if (extra2 && !extra1) - return false; - if (extra1 && extra2) { - if (extra1->static_metacall != extra2->static_metacall) - return false; - objects1 = extra1->objects; - objects2 = extra1->objects; - } - } else if (meta1->d.data[0] == meta2->d.data[0] && meta1->d.data[0] == 1) { - objects1 = (const QMetaObject **)(meta1->d.extradata); - objects2 = (const QMetaObject **)(meta2->d.extradata); - } + const QMetaObject **objects1 = meta1->d.relatedMetaObjects; + const QMetaObject **objects2 = meta2->d.relatedMetaObjects; if (objects1 && !objects2) return false; if (objects2 && !objects1) @@ -1402,7 +1385,7 @@ private: }; QMetaObject TestObject::staticMetaObject = { - { 0, 0, 0, 0 } + { 0, 0, 0, 0, 0, 0 } }; TestObject::TestObject(QObject *parent) diff --git a/tests/auto/tools/moc/tst_moc.cpp b/tests/auto/tools/moc/tst_moc.cpp index 78e18f9229..b354e0a82a 100644 --- a/tests/auto/tools/moc/tst_moc.cpp +++ b/tests/auto/tools/moc/tst_moc.cpp @@ -847,10 +847,7 @@ void tst_Moc::testExtraDataForEnum() const QMetaObject *mobjUser = &EnumUserClass::staticMetaObject; QCOMPARE(mobjUser->enumeratorCount(), 0); - const QMetaObjectExtraData *extra = reinterpret_cast(mobjUser->d.extradata); - QVERIFY(extra); - - const QMetaObject **objects = extra->objects; + const QMetaObject **objects = mobjUser->d.relatedMetaObjects; QVERIFY(objects); QVERIFY(objects[0] == mobjSource); QVERIFY(objects[1] == 0); -- cgit v1.2.3