[ChangeLog][QtQml] Fix JavaScript Array.pop() not updating the internal array length...
authorSimon Hausmann <simon.hausmann@digia.com>
Tue, 7 Jan 2014 08:59:10 +0000 (09:59 +0100)
committerThe Qt Project <gerrit-noreply@qt-project.org>
Tue, 7 Jan 2014 15:11:39 +0000 (16:11 +0100)
While the length property was reporting the correct value, the internal array
length was out-of-sync.

Task-number: QTBUG-35979

Change-Id: I68820a349cf1ce88c6aabc6a2301a8a861018a10
Reviewed-by: Liang Qi <liang.qi@digia.com>
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
src/qml/jsruntime/qv4arrayobject.cpp
tests/auto/qml/qjsengine/tst_qjsengine.cpp

index 1628cfe4da518c327c5c377d92324ae5cacbf99f..296471692c234e6ed5c7241757d8842066fad87c 100644 (file)
@@ -276,7 +276,7 @@ ReturnedValue ArrayPrototype::method_pop(CallContext *ctx)
     if (scope.hasException())
         return Encode::undefined();
     if (instance->isArrayObject())
-        instance->setArrayLengthUnchecked(len - 1);
+        instance->setArrayLength(len - 1);
     else
         instance->put(ctx->engine->id_length, ScopedValue(scope, Primitive::fromDouble(len - 1)));
     return result.asReturnedValue();
index 726f8636b6c6107ebc121c8153e62e2f36737b1e..a1662b495c18d2bef2ec6e29bf2eccc9f72e3b6e 100644 (file)
@@ -146,6 +146,8 @@ private slots:
     void threadedEngine();
 
     void functionDeclarationsInConditionals();
+
+    void arrayPop_QTBUG_35979();
 };
 
 tst_QJSEngine::tst_QJSEngine()
@@ -2692,6 +2694,17 @@ void tst_QJSEngine::functionDeclarationsInConditionals()
     QCOMPARE(result.toBool(), true);
 }
 
+void tst_QJSEngine::arrayPop_QTBUG_35979()
+{
+    QJSEngine eng;
+    QJSValue result = eng.evaluate(""
+            "var x = [1, 2]\n"
+            "x.pop()\n"
+            "x[1] = 3\n"
+            "x.toString()\n");
+    QCOMPARE(result.toString(), QString("1,3"));
+}
+
 QTEST_MAIN(tst_QJSEngine)
 
 #include "tst_qjsengine.moc"