From 18a5a096c9020c7b1b10b82009c912b4b97335a3 Mon Sep 17 00:00:00 2001 From: Michael Brasser Date: Fri, 15 Jan 2010 10:44:58 +1000 Subject: QmlGuard the list of objects in a Package. Don't crash if those objects are deleted before the Package. --- src/declarative/util/qmlpackage.cpp | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/declarative/util/qmlpackage.cpp b/src/declarative/util/qmlpackage.cpp index f9238ca..3214dc8 100644 --- a/src/declarative/util/qmlpackage.cpp +++ b/src/declarative/util/qmlpackage.cpp @@ -42,6 +42,7 @@ #include "qmlpackage_p.h" #include +#include "private/qmlguard_p.h" QT_BEGIN_NAMESPACE @@ -50,7 +51,28 @@ class QmlPackagePrivate : public QObjectPrivate public: QmlPackagePrivate() {} - QmlConcreteList dataList; + class DataList; + struct DataGuard : public QmlGuard + { + DataGuard(QObject *obj, DataList *l) : list(l) { (QmlGuard&)*this = obj; } + DataList *list; + void objectDestroyed(QObject *) { + // we assume priv will always be destroyed after objectDestroyed calls + list->removeOne(*this); + } + }; + + class DataList : public QList, public QmlList + { + public: + virtual void append(QObject* v) { QList::append(DataGuard(v, this)); } + virtual void insert(int i, QObject* v) { QList::insert(i, DataGuard(v, this)); } + virtual void clear() { QList::clear(); } + virtual QObject* at(int i) const { return QList::at(i); } + virtual void removeAt(int i) { QList::removeAt(i); } + virtual int count() const { return QList::count(); } + }; + DataList dataList; }; class QmlPackageAttached : public QObject -- cgit v0.12