summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrew den Exter <andrew.den-exter@nokia.com>2012-02-08 15:13:22 +1000
committerQt by Nokia <qt-info@nokia.com>2012-02-08 09:53:23 +0100
commit979cb5a09e3c2c438eb7f122325d66ed6bf80aba (patch)
treed7b8b4f8260f49078d8587f8e317b9255b77bdf7
parent09900d3dc5158bca6ec4d40c1a770d32db413894 (diff)
Initialize dynamic meta object extradata.
QMetaObject::invokeMethod attempts to deference the extradata for meta objects versions 6 and greater which is causing a crash in some of the qtquick1 tests. Change-Id: If5b2ca83b15de2cd558976c6b681dd5457c404d1 Reviewed-by: Chris Adams <christopher.adams@nokia.com> Reviewed-by: Kent Hansen <kent.hansen@nokia.com>
-rw-r--r--src/corelib/kernel/qmetaobjectbuilder.cpp1
-rw-r--r--tests/auto/corelib/kernel/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp34
2 files changed, 35 insertions, 0 deletions
diff --git a/src/corelib/kernel/qmetaobjectbuilder.cpp b/src/corelib/kernel/qmetaobjectbuilder.cpp
index 529ca22107..064b8edafd 100644
--- a/src/corelib/kernel/qmetaobjectbuilder.cpp
+++ b/src/corelib/kernel/qmetaobjectbuilder.cpp
@@ -1432,6 +1432,7 @@ void QMetaObjectBuilder::fromRelocatableData(QMetaObject *output,
output->d.superdata = superclass;
output->d.stringdata = buf + stringdataOffset;
output->d.data = reinterpret_cast<const uint *>(buf + dataOffset);
+ output->d.extradata = 0;
}
/*!
diff --git a/tests/auto/corelib/kernel/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp b/tests/auto/corelib/kernel/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp
index def1b74ea4..966ac021ac 100644
--- a/tests/auto/corelib/kernel/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp
+++ b/tests/auto/corelib/kernel/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp
@@ -64,6 +64,7 @@ private slots:
void staticMetacall();
void copyMetaObject();
void serialize();
+ void relocatableData();
void removeNotifySignal();
void usage_signal();
@@ -1028,6 +1029,39 @@ void tst_QMetaObjectBuilder::serialize()
}
}
+void tst_QMetaObjectBuilder::relocatableData()
+{
+ QMetaObjectBuilder builder;
+ builder.setClassName("TestObject");
+
+ QMetaMethodBuilder intPropChanged = builder.addSignal("intPropChanged(int)");
+ intPropChanged.setParameterNames(QList<QByteArray>() << "newIntPropValue");
+
+ QMetaPropertyBuilder prop = builder.addProperty("intProp", "int");
+ prop.setNotifySignal(intPropChanged);
+
+ QMetaMethodBuilder voidSlotInt = builder.addSlot("voidSlotInt(int)");
+ voidSlotInt.setParameterNames(QList<QByteArray>() << "slotIntArg");
+
+ QMetaMethodBuilder listInvokableQRealQString = builder.addMethod("listInvokableQRealQString(qreal,QString)");
+ listInvokableQRealQString.setReturnType("QVariantList");
+ listInvokableQRealQString.setParameterNames(QList<QByteArray>() << "qrealArg" << "qstringArg");
+
+ bool ok = false;
+ QByteArray data = builder.toRelocatableData(&ok);
+ QVERIFY(ok);
+
+ QMetaObjectBuilder builder2;
+ QMetaObject meta2;
+ builder2.fromRelocatableData(&meta2, &QObject::staticMetaObject, data);
+
+ QMetaObject *meta = builder.toMetaObject();
+
+ QVERIFY(sameMetaObject(meta, &meta2));
+ free(meta);
+}
+
+
// Check that removing a method updates notify signals appropriately
void tst_QMetaObjectBuilder::removeNotifySignal()
{