Fix a bug in the assignment operators for QJsonObject and Array
authorLars Knoll <lars.knoll@nokia.com>
Thu, 8 Mar 2012 09:41:55 +0000 (10:41 +0100)
committerQt by Nokia <qt-info@nokia.com>
Thu, 8 Mar 2012 15:06:48 +0000 (16:06 +0100)
When objects or arrays where being used read only, several objects
can share the same d pointer, but will have different pointers into
the binary data. Correctly change the pointer into the binary
data even if the d-pointer is the same.

Change-Id: Ife0ea5ac5daf46586f855dccdf35b51ec696a623
Reviewed-by: João Abecasis <joao.abecasis@nokia.com>
src/corelib/json/qjsonarray.cpp
src/corelib/json/qjsonobject.cpp
tests/auto/corelib/json/tst_qtjson.cpp

index 433a681..6bae200 100644 (file)
@@ -122,10 +122,10 @@ QJsonArray &QJsonArray::operator =(const QJsonArray &other)
         if (d && !d->ref.deref())
             delete d;
         d = other.d;
-        a = other.a;
         if (d)
             d->ref.ref();
     }
+    a = other.a;
 
     return *this;
 }
index cfe71e8..e14000f 100644 (file)
@@ -125,10 +125,10 @@ QJsonObject &QJsonObject::operator =(const QJsonObject &other)
         if (d && !d->ref.deref())
             delete d;
         d = other.d;
-        o = other.o;
         if (d)
             d->ref.ref();
     }
+    o = other.o;
 
     return *this;
 }
index f35831c..079ff6e 100644 (file)
@@ -117,6 +117,9 @@ private Q_SLOTS:
     void testCompactionError();
 
     void parseUnicodeEscapes();
+
+    void assignObjects();
+    void assignArrays();
 private:
     QString testDataDir;
 };
@@ -1774,5 +1777,35 @@ void TestQtJson::parseUnicodeEscapes()
     QCOMPARE(array.first().toString(), result);
 }
 
+void TestQtJson::assignObjects()
+{
+    const char *json =
+            "[ { \"Key\": 1 }, { \"Key\": 2 } ]";
+
+    QJsonDocument doc = QJsonDocument::fromJson(json);
+    QJsonArray array = doc.array();
+
+    QJsonObject object = array.at(0).toObject();
+    QCOMPARE(object.value("Key").toDouble(), 1.);
+
+    object = array.at(1).toObject();
+    QCOMPARE(object.value("Key").toDouble(), 2.);
+}
+
+void TestQtJson::assignArrays()
+{
+    const char *json =
+            "[ [ 1 ], [ 2 ] ]";
+
+    QJsonDocument doc = QJsonDocument::fromJson(json);
+    QJsonArray array = doc.array();
+
+    QJsonArray inner = array.at(0).toArray()  ;
+    QCOMPARE(inner.at(0).toDouble(), 1.);
+
+    inner= array.at(1).toArray();
+    QCOMPARE(inner.at(0).toDouble(), 2.);
+}
+
 QTEST_MAIN(TestQtJson)
 #include "tst_qtjson.moc"