diff options
Diffstat (limited to 'src/corelib/json/qjsonarray.cpp')
-rw-r--r-- | src/corelib/json/qjsonarray.cpp | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/src/corelib/json/qjsonarray.cpp b/src/corelib/json/qjsonarray.cpp index 5f1c38a752..fb8d2e83ff 100644 --- a/src/corelib/json/qjsonarray.cpp +++ b/src/corelib/json/qjsonarray.cpp @@ -391,9 +391,10 @@ QJsonValue QJsonArray::takeAt(int i) void QJsonArray::insert(int i, const QJsonValue &value) { Q_ASSERT (i >= 0 && i <= (a ? (int)a->length : 0)); + QJsonValue val = value; bool compressed; - int valueSize = QJsonPrivate::Value::requiredStorage(value, &compressed); + int valueSize = QJsonPrivate::Value::requiredStorage(val, &compressed); detach(valueSize + sizeof(QJsonPrivate::Value)); @@ -401,13 +402,16 @@ void QJsonArray::insert(int i, const QJsonValue &value) a->tableOffset = sizeof(QJsonPrivate::Array); int valueOffset = a->reserveSpace(valueSize, i, 1, false); + if (!valueOffset) + return; + QJsonPrivate::Value &v = (*a)[i]; - v.type = (value.t == QJsonValue::Undefined ? QJsonValue::Null : value.t); + v.type = (val.t == QJsonValue::Undefined ? QJsonValue::Null : val.t); v.latinOrIntValue = compressed; v.latinKey = false; - v.value = QJsonPrivate::Value::valueToStore(value, valueOffset); + v.value = QJsonPrivate::Value::valueToStore(val, valueOffset); if (valueSize) - QJsonPrivate::Value::copyData(value, (char *)a + valueOffset, compressed); + QJsonPrivate::Value::copyData(val, (char *)a + valueOffset, compressed); } /*! @@ -437,9 +441,10 @@ void QJsonArray::insert(int i, const QJsonValue &value) void QJsonArray::replace(int i, const QJsonValue &value) { Q_ASSERT (a && i >= 0 && i < (int)(a->length)); + QJsonValue val = value; bool compressed; - int valueSize = QJsonPrivate::Value::requiredStorage(value, &compressed); + int valueSize = QJsonPrivate::Value::requiredStorage(val, &compressed); detach(valueSize); @@ -447,13 +452,16 @@ void QJsonArray::replace(int i, const QJsonValue &value) a->tableOffset = sizeof(QJsonPrivate::Array); int valueOffset = a->reserveSpace(valueSize, i, 1, true); + if (!valueOffset) + return; + QJsonPrivate::Value &v = (*a)[i]; - v.type = (value.t == QJsonValue::Undefined ? QJsonValue::Null : value.t); + v.type = (val.t == QJsonValue::Undefined ? QJsonValue::Null : val.t); v.latinOrIntValue = compressed; v.latinKey = false; - v.value = QJsonPrivate::Value::valueToStore(value, valueOffset); + v.value = QJsonPrivate::Value::valueToStore(val, valueOffset); if (valueSize) - QJsonPrivate::Value::copyData(value, (char *)a + valueOffset, compressed); + QJsonPrivate::Value::copyData(val, (char *)a + valueOffset, compressed); ++d->compactionCounter; if (d->compactionCounter > 32u && d->compactionCounter >= unsigned(a->length) / 2u) |