aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/qml/qml/qqmlvmemetaobject.cpp5
-rw-r--r--tests/auto/qml/qqmlcontext/data/ContainerComponent.qml5
-rw-r--r--tests/auto/qml/qqmlcontext/data/ContentComponent.qml10
-rw-r--r--tests/auto/qml/qqmlcontext/data/evalAfterInvalidate.qml14
-rw-r--r--tests/auto/qml/qqmlcontext/tst_qqmlcontext.cpp12
5 files changed, 46 insertions, 0 deletions
diff --git a/src/qml/qml/qqmlvmemetaobject.cpp b/src/qml/qml/qqmlvmemetaobject.cpp
index 97781617de..dd2fe4baeb 100644
--- a/src/qml/qml/qqmlvmemetaobject.cpp
+++ b/src/qml/qml/qqmlvmemetaobject.cpp
@@ -809,6 +809,11 @@ int QQmlVMEMetaObject::metaCall(QMetaObject::Call c, int _id, void **a)
v8::Handle<v8::Function> QQmlVMEMetaObject::method(int index)
{
+ if (!ctxt || !ctxt->isValid()) {
+ qWarning("QQmlVMEMetaObject: Internal error - attempted to evaluate a function in an invalid context");
+ return v8::Handle<v8::Function>();
+ }
+
if (!v8methods)
v8methods = new v8::Persistent<v8::Function>[metaData->methodCount];
diff --git a/tests/auto/qml/qqmlcontext/data/ContainerComponent.qml b/tests/auto/qml/qqmlcontext/data/ContainerComponent.qml
new file mode 100644
index 0000000000..ae90c20cf8
--- /dev/null
+++ b/tests/auto/qml/qqmlcontext/data/ContainerComponent.qml
@@ -0,0 +1,5 @@
+import QtQuick 2.0
+
+Item {
+ function doSomething() { if (333 == 666) console.log('doSomething') }
+}
diff --git a/tests/auto/qml/qqmlcontext/data/ContentComponent.qml b/tests/auto/qml/qqmlcontext/data/ContentComponent.qml
new file mode 100644
index 0000000000..f937b196ed
--- /dev/null
+++ b/tests/auto/qml/qqmlcontext/data/ContentComponent.qml
@@ -0,0 +1,10 @@
+import QtQuick 2.0
+
+Item {
+ property int count: 0
+ property bool hasValidParent: parent && parent.children.length != 0
+
+ onHasValidParentChanged: {
+ if (++count > 1) parent.doSomething()
+ }
+}
diff --git a/tests/auto/qml/qqmlcontext/data/evalAfterInvalidate.qml b/tests/auto/qml/qqmlcontext/data/evalAfterInvalidate.qml
new file mode 100644
index 0000000000..27879c48bf
--- /dev/null
+++ b/tests/auto/qml/qqmlcontext/data/evalAfterInvalidate.qml
@@ -0,0 +1,14 @@
+import QtQuick 2.0
+
+Rectangle {
+ id: root
+
+ Component.onCompleted: {
+ var i = containerComponent.createObject(root);
+ contentComponent.createObject(i);
+ i.destroy()
+ }
+
+ property Component containerComponent: ContainerComponent {}
+ property Component contentComponent: ContentComponent {}
+}
diff --git a/tests/auto/qml/qqmlcontext/tst_qqmlcontext.cpp b/tests/auto/qml/qqmlcontext/tst_qqmlcontext.cpp
index 16365eeaa8..55f93c62c9 100644
--- a/tests/auto/qml/qqmlcontext/tst_qqmlcontext.cpp
+++ b/tests/auto/qml/qqmlcontext/tst_qqmlcontext.cpp
@@ -71,6 +71,8 @@ private slots:
void refreshExpressionsRootContext();
void qtbug_22535();
+ void evalAfterInvalidate();
+
private:
QQmlEngine engine;
};
@@ -647,6 +649,16 @@ void tst_qqmlcontext::qtbug_22535()
delete o;
}
+void tst_qqmlcontext::evalAfterInvalidate()
+{
+ QQmlEngine engine;
+ QQmlComponent component(&engine, testFileUrl("evalAfterInvalidate.qml"));
+ QScopedPointer<QObject> o(component.create());
+
+ QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete);
+ QCoreApplication::processEvents();
+}
+
QTEST_MAIN(tst_qqmlcontext)
#include "tst_qqmlcontext.moc"