Add autotest for qml/v8 optimization bug
authorKent Hansen <kent.hansen@nokia.com>
Fri, 11 Nov 2011 08:39:15 +0000 (09:39 +0100)
committerQt by Nokia <qt-info@nokia.com>
Wed, 16 Nov 2011 12:04:50 +0000 (13:04 +0100)
After a function that accesses a qml context property was
inlined, calls to global functions would fail with
"TypeError: Illegal invocation".
Fixed in qtbase's v8.

Task-number: QTBUG-22679
Change-Id: Id6e2604e5151585febfe1b667869dc3b1fad6e5e
Reviewed-by: Aaron Kennedy <aaron.kennedy@nokia.com>
tests/auto/declarative/qdeclarativeecmascript/data/qtbug_22679.qml [new file with mode: 0644]
tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp

diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/qtbug_22679.qml b/tests/auto/declarative/qdeclarativeecmascript/data/qtbug_22679.qml
new file mode 100644 (file)
index 0000000..b38a84b
--- /dev/null
@@ -0,0 +1,14 @@
+import QtQuick 2.0
+
+QtObject {
+    function accessContextProperty() {
+        for (var i = 0; i < contextProp.stringProperty.length; ++i) ;
+    }
+
+    Component.onCompleted: {
+        for (var i = 0; i < 1000; ++i)
+            accessContextProperty();
+        // Shouldn't cause "Illegal invocation" error.
+        gc();
+    }
+}
index e784ffb..7d9819b 100644 (file)
@@ -223,6 +223,7 @@ private slots:
     void invokableObjectArg();
     void invokableObjectRet();
     void qtbug_20344();
+    void qtbug_22679();
     void revisionErrors();
     void revision();
 
@@ -5148,6 +5149,22 @@ void tst_qdeclarativeecmascript::deleteWhileBindingRunning()
     delete object;
 }
 
+void tst_qdeclarativeecmascript::qtbug_22679()
+{
+    MyQmlObject object;
+    object.setStringProperty(QLatin1String("Please work correctly"));
+    engine.rootContext()->setContextProperty("contextProp", &object);
+
+    QDeclarativeComponent component(&engine, TEST_FILE("qtbug_22679.qml"));
+    qRegisterMetaType<QList<QDeclarativeError> >("QList<QDeclarativeError>");
+    QSignalSpy warningsSpy(&engine, SIGNAL(warnings(QList<QDeclarativeError>)));
+
+    QObject *o = component.create();
+    QVERIFY(o != 0);
+    QCOMPARE(warningsSpy.count(), 0);
+    delete o;
+}
+
 QTEST_MAIN(tst_qdeclarativeecmascript)
 
 #include "tst_qdeclarativeecmascript.moc"