summaryrefslogtreecommitdiffstats
path: root/src/declarative/qml
diff options
context:
space:
mode:
authorAaron Kennedy <aaron.kennedy@nokia.com>2009-05-06 00:56:28 (GMT)
committerAaron Kennedy <aaron.kennedy@nokia.com>2009-05-06 01:01:17 (GMT)
commit547223a4f31067ed34acabd9a2d8a0b7645fd3f8 (patch)
treeb4e676646c7f9b569428784d255c22fdca9467df /src/declarative/qml
parentb291ab1f5ebb496d7eb7aae04c3f06d57a4f547d (diff)
downloadQt-547223a4f31067ed34acabd9a2d8a0b7645fd3f8.zip
Qt-547223a4f31067ed34acabd9a2d8a0b7645fd3f8.tar.gz
Qt-547223a4f31067ed34acabd9a2d8a0b7645fd3f8.tar.bz2
Fix crash
As QMetaObject::indexOfProperty() downcasts QMetaObject's that have the DynamicMetaObject flag set, we must ensure that we use a QAbstractDynamicMetaObject whereever we set this flag, otherwise it may crash.
Diffstat (limited to 'src/declarative/qml')
-rw-r--r--src/declarative/qml/qmlcompiler.cpp5
-rw-r--r--src/declarative/qml/qmlparser.cpp6
-rw-r--r--src/declarative/qml/qmlparser_p.h3
3 files changed, 8 insertions, 6 deletions
diff --git a/src/declarative/qml/qmlcompiler.cpp b/src/declarative/qml/qmlcompiler.cpp
index f0cf4cc..67a0a04 100644
--- a/src/declarative/qml/qmlcompiler.cpp
+++ b/src/declarative/qml/qmlcompiler.cpp
@@ -1276,9 +1276,10 @@ bool QmlCompiler::compileDynamicMeta(QmlParser::Object *obj)
if (obj->metatype)
builder.setSuperClass(obj->metatype);
- obj->extObject = builder.toMetaObject();
+ obj->extObjectData = builder.toMetaObject();
+ static_cast<QMetaObject &>(obj->extObject) = *obj->extObjectData;
- output->mos << obj->extObject;
+ output->mos << obj->extObjectData;
QmlInstruction store;
store.type = QmlInstruction::StoreMetaObject;
store.storeMeta.data = output->mos.count() - 1;
diff --git a/src/declarative/qml/qmlparser.cpp b/src/declarative/qml/qmlparser.cpp
index a943c4d..d68eb68 100644
--- a/src/declarative/qml/qmlparser.cpp
+++ b/src/declarative/qml/qmlparser.cpp
@@ -63,7 +63,7 @@ QT_BEGIN_NAMESPACE
using namespace QmlParser;
QmlParser::Object::Object()
-: type(-1), metatype(0), extObject(0), defaultProperty(0), line(-1), column(-1)
+: type(-1), metatype(0), extObjectData(0), defaultProperty(0), line(-1), column(-1)
{
}
@@ -76,8 +76,8 @@ QmlParser::Object::~Object()
const QMetaObject *Object::metaObject() const
{
- if (extObject && metatype)
- return extObject;
+ if (extObjectData && metatype)
+ return &extObject;
else
return metatype;
}
diff --git a/src/declarative/qml/qmlparser_p.h b/src/declarative/qml/qmlparser_p.h
index 676e25e..2c9b0f1 100644
--- a/src/declarative/qml/qmlparser_p.h
+++ b/src/declarative/qml/qmlparser_p.h
@@ -94,7 +94,8 @@ namespace QmlParser
const QMetaObject *metatype;
// The synthesized metaobject, if QML added signals or properties to
// this type. Otherwise null
- QMetaObject *extObject;
+ QMetaObject *extObjectData;
+ QAbstractDynamicMetaObject extObject;
Property *getDefaultProperty();
Property *getProperty(const QByteArray &name, bool create=true);