aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/declarative/qml/qdeclarativecontext.cpp16
-rw-r--r--tests/auto/declarative/qdeclarativecontext/data/Object_22535.qml8
-rw-r--r--tests/auto/declarative/qdeclarativecontext/data/qtbug_22535.qml10
-rw-r--r--tests/auto/declarative/qdeclarativecontext/tst_qdeclarativecontext.cpp13
4 files changed, 39 insertions, 8 deletions
diff --git a/src/declarative/qml/qdeclarativecontext.cpp b/src/declarative/qml/qdeclarativecontext.cpp
index 1723603d29..50e2235768 100644
--- a/src/declarative/qml/qdeclarativecontext.cpp
+++ b/src/declarative/qml/qdeclarativecontext.cpp
@@ -529,14 +529,6 @@ QDeclarativeContextData::QDeclarativeContextData(QDeclarativeContext *ctxt)
void QDeclarativeContextData::invalidate()
{
- while (childContexts) {
- if (childContexts->ownedByParent) {
- childContexts->destroy();
- } else {
- childContexts->invalidate();
- }
- }
-
while (componentAttached) {
QDeclarativeComponentAttached *a = componentAttached;
componentAttached = a->next;
@@ -548,6 +540,14 @@ void QDeclarativeContextData::invalidate()
emit a->destruction();
}
+ while (childContexts) {
+ if (childContexts->ownedByParent) {
+ childContexts->destroy();
+ } else {
+ childContexts->invalidate();
+ }
+ }
+
if (prevChild) {
*prevChild = nextChild;
if (nextChild) nextChild->prevChild = prevChild;
diff --git a/tests/auto/declarative/qdeclarativecontext/data/Object_22535.qml b/tests/auto/declarative/qdeclarativecontext/data/Object_22535.qml
new file mode 100644
index 0000000000..294c744317
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativecontext/data/Object_22535.qml
@@ -0,0 +1,8 @@
+import QtQuick 2.0
+
+QtObject {
+
+ function goodBye()
+ {
+ }
+}
diff --git a/tests/auto/declarative/qdeclarativecontext/data/qtbug_22535.qml b/tests/auto/declarative/qdeclarativecontext/data/qtbug_22535.qml
new file mode 100644
index 0000000000..3553f6c03b
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativecontext/data/qtbug_22535.qml
@@ -0,0 +1,10 @@
+import QtQuick 2.0
+
+Rectangle {
+ width: 64
+ height: 64
+
+ Object_22535 { id:o }
+
+ Component.onDestruction: o.goodBye()
+}
diff --git a/tests/auto/declarative/qdeclarativecontext/tst_qdeclarativecontext.cpp b/tests/auto/declarative/qdeclarativecontext/tst_qdeclarativecontext.cpp
index 68599a2e83..ba9db4f875 100644
--- a/tests/auto/declarative/qdeclarativecontext/tst_qdeclarativecontext.cpp
+++ b/tests/auto/declarative/qdeclarativecontext/tst_qdeclarativecontext.cpp
@@ -80,6 +80,7 @@ private slots:
void refreshExpressionsCrash();
void refreshExpressionsRootContext();
+ void qtbug_22535();
private:
QDeclarativeEngine engine;
};
@@ -644,6 +645,18 @@ void tst_qdeclarativecontext::refreshExpressionsRootContext()
delete o1;
}
+void tst_qdeclarativecontext::qtbug_22535()
+{
+ QDeclarativeEngine engine;
+ QDeclarativeComponent component(&engine, TEST_FILE("qtbug_22535.qml"));
+ QDeclarativeContext context(engine.rootContext());
+
+ QObject *o = component.create(&context);
+
+ // Don't crash!
+ delete o;
+}
+
QTEST_MAIN(tst_qdeclarativecontext)
#include "tst_qdeclarativecontext.moc"