Fix a bug in the assignment operators for QJsonObject and Array

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>
bb10
Lars Knoll 2012-03-08 10:41:55 +01:00 committed by Qt by Nokia
parent cf6dd5baca
commit 763790bb5c
3 changed files with 35 additions and 2 deletions

View 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;
}

View 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;
}

View 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"