summaryrefslogtreecommitdiffstats
path: root/src/corelib/json
diff options
context:
space:
mode:
Diffstat (limited to 'src/corelib/json')
-rw-r--r--src/corelib/json/qjson.cpp4
-rw-r--r--src/corelib/json/qjson_p.h20
-rw-r--r--src/corelib/json/qjsondocument.cpp22
-rw-r--r--src/corelib/json/qjsonparser.cpp15
-rw-r--r--src/corelib/json/qjsonparser_p.h1
-rw-r--r--src/corelib/json/qjsonvalue.cpp11
-rw-r--r--src/corelib/json/qjsonwriter_p.h2
7 files changed, 62 insertions, 13 deletions
diff --git a/src/corelib/json/qjson.cpp b/src/corelib/json/qjson.cpp
index 5286c4cc8e..d509349a51 100644
--- a/src/corelib/json/qjson.cpp
+++ b/src/corelib/json/qjson.cpp
@@ -340,7 +340,7 @@ bool Value::isValid(const Base *b) const
case QJsonValue::Double:
if (latinOrIntValue)
break;
- // fall through
+ Q_FALLTHROUGH();
case QJsonValue::String:
case QJsonValue::Array:
case QJsonValue::Object:
@@ -419,7 +419,7 @@ uint Value::valueToStore(const QJsonValue &v, uint offset)
if (c != INT_MAX)
return c;
}
- // fall through
+ Q_FALLTHROUGH();
case QJsonValue::String:
case QJsonValue::Array:
case QJsonValue::Object:
diff --git a/src/corelib/json/qjson_p.h b/src/corelib/json/qjson_p.h
index b1b03601b2..0c78fadfc7 100644
--- a/src/corelib/json/qjson_p.h
+++ b/src/corelib/json/qjson_p.h
@@ -151,6 +151,14 @@ public:
val = qToLittleEndian(qFromLittleEndian(val) + i);
return *this;
}
+ q_littleendian &operator |=(T i) {
+ val = qToLittleEndian(qFromLittleEndian(val) | i);
+ return *this;
+ }
+ q_littleendian &operator &=(T i) {
+ val = qToLittleEndian(qFromLittleEndian(val) & i);
+ return *this;
+ }
};
} // namespace QJsonPrivate
@@ -205,6 +213,14 @@ public:
*this = (uint(*this) - i);
return *this;
}
+ qle_bitfield &operator |=(uint i) {
+ *this = (uint(*this) | i);
+ return *this;
+ }
+ qle_bitfield &operator &=(uint i) {
+ *this = (uint(*this) & i);
+ return *this;
+ }
};
template<int pos, int width>
@@ -408,7 +424,7 @@ public:
const ushort *uc = (const ushort *)str.unicode();
int i = 0;
#ifdef __SSE2__
- for ( ; i + 16 < len; i += 16) {
+ for ( ; i + 16 <= len; i += 16) {
__m128i chunk1 = _mm_loadu_si128((__m128i*)&uc[i]); // load
__m128i chunk2 = _mm_loadu_si128((__m128i*)&uc[i + 8]); // load
// pack the two vector to 16 x 8bits elements
@@ -417,7 +433,7 @@ public:
}
# ifdef Q_PROCESSOR_X86_64
// we can do one more round, of 8 characters
- if (i + 8 < len) {
+ if (i + 8 <= len) {
__m128i chunk = _mm_loadu_si128((__m128i*)&uc[i]); // load
// pack with itself, we'll discard the high part anyway
chunk = _mm_packus_epi16(chunk, chunk);
diff --git a/src/corelib/json/qjsondocument.cpp b/src/corelib/json/qjsondocument.cpp
index b943818583..ed454d5442 100644
--- a/src/corelib/json/qjsondocument.cpp
+++ b/src/corelib/json/qjsondocument.cpp
@@ -260,19 +260,28 @@ QJsonDocument QJsonDocument::fromBinaryData(const QByteArray &data, DataValidati
Creates a QJsonDocument from the QVariant \a variant.
If the \a variant contains any other type than a QVariantMap,
- QVariantList or QStringList, the returned document is invalid.
+ QVariantHash, QVariantList or QStringList, the returned document is invalid.
\sa toVariant()
*/
QJsonDocument QJsonDocument::fromVariant(const QVariant &variant)
{
QJsonDocument doc;
- if (variant.type() == QVariant::Map) {
+ switch (variant.type()) {
+ case QVariant::Map:
doc.setObject(QJsonObject::fromVariantMap(variant.toMap()));
- } else if (variant.type() == QVariant::List) {
+ break;
+ case QVariant::Hash:
+ doc.setObject(QJsonObject::fromVariantHash(variant.toHash()));
+ break;
+ case QVariant::List:
doc.setArray(QJsonArray::fromVariantList(variant.toList()));
- } else if (variant.type() == QVariant::StringList) {
+ break;
+ case QVariant::StringList:
doc.setArray(QJsonArray::fromStringList(variant.toStringList()));
+ break;
+ default:
+ break;
}
return doc;
}
@@ -341,10 +350,9 @@ QByteArray QJsonDocument::toJson() const
#ifndef QT_JSON_READONLY
QByteArray QJsonDocument::toJson(JsonFormat format) const
{
- if (!d)
- return QByteArray();
-
QByteArray json;
+ if (!d)
+ return json;
if (d->header->root()->isArray())
QJsonPrivate::Writer::arrayToJson(static_cast<QJsonPrivate::Array *>(d->header->root()), json, 0, (format == Compact));
diff --git a/src/corelib/json/qjsonparser.cpp b/src/corelib/json/qjsonparser.cpp
index 094cb7a76b..0eb0d21ecf 100644
--- a/src/corelib/json/qjsonparser.cpp
+++ b/src/corelib/json/qjsonparser.cpp
@@ -283,7 +283,6 @@ char Parser::nextToken()
case ValueSeparator:
case EndArray:
case EndObject:
- eatSpace();
case Quote:
break;
default:
@@ -469,6 +468,10 @@ bool Parser::parseMember(int baseOffset)
lastError = QJsonParseError::MissingNameSeparator;
return false;
}
+ if (!eatSpace()) {
+ lastError = QJsonParseError::UnterminatedObject;
+ return false;
+ }
QJsonPrivate::Value val;
if (!parseValue(&val, baseOffset))
return false;
@@ -544,6 +547,10 @@ bool Parser::parseArray()
nextToken();
} else {
while (1) {
+ if (!eatSpace()) {
+ lastError = QJsonParseError::UnterminatedArray;
+ return false;
+ }
QJsonPrivate::Value val;
if (!parseValue(&val, arrayOffset))
return false;
@@ -686,6 +693,12 @@ bool Parser::parseValue(QJsonPrivate::Value *val, int baseOffset)
DEBUG << "value: object";
END;
return true;
+ case ValueSeparator:
+ // Essentially missing value, but after a colon, not after a comma
+ // like the other MissingObject errors.
+ lastError = QJsonParseError::IllegalValue;
+ return false;
+ case EndObject:
case EndArray:
lastError = QJsonParseError::MissingObject;
return false;
diff --git a/src/corelib/json/qjsonparser_p.h b/src/corelib/json/qjsonparser_p.h
index 920f265ca3..afa2c1a8cf 100644
--- a/src/corelib/json/qjsonparser_p.h
+++ b/src/corelib/json/qjsonparser_p.h
@@ -51,6 +51,7 @@
// We mean it.
//
+#include <QtCore/private/qglobal_p.h>
#include <qjsondocument.h>
#include <qvarlengtharray.h>
diff --git a/src/corelib/json/qjsonvalue.cpp b/src/corelib/json/qjsonvalue.cpp
index 718dfa43b3..4b52014db1 100644
--- a/src/corelib/json/qjsonvalue.cpp
+++ b/src/corelib/json/qjsonvalue.cpp
@@ -349,6 +349,12 @@ QJsonValue &QJsonValue::operator =(const QJsonValue &other)
\row
\li
\list
+ \li QMetaType::Nullptr
+ \endlist
+ \li QJsonValue::Null
+ \row
+ \li
+ \list
\li QMetaType::Bool
\endlist
\li QJsonValue::Bool
@@ -393,6 +399,8 @@ QJsonValue &QJsonValue::operator =(const QJsonValue &other)
QJsonValue QJsonValue::fromVariant(const QVariant &variant)
{
switch (variant.userType()) {
+ case QMetaType::Nullptr:
+ return QJsonValue(Null);
case QVariant::Bool:
return QJsonValue(variant.toBool());
case QVariant::Int:
@@ -438,7 +446,7 @@ QJsonValue QJsonValue::fromVariant(const QVariant &variant)
The QJsonValue types will be converted as follows:
- \value Null \l {QVariant::}{QVariant()}
+ \value Null QMetaType::Nullptr
\value Bool QMetaType::Bool
\value Double QMetaType::Double
\value String QString
@@ -466,6 +474,7 @@ QVariant QJsonValue::toVariant() const
QJsonObject(d, static_cast<QJsonPrivate::Object *>(base)).toVariantMap() :
QVariantMap();
case Null:
+ return QVariant::fromValue(nullptr);
case Undefined:
break;
}
diff --git a/src/corelib/json/qjsonwriter_p.h b/src/corelib/json/qjsonwriter_p.h
index b9cdbb6976..76a8460449 100644
--- a/src/corelib/json/qjsonwriter_p.h
+++ b/src/corelib/json/qjsonwriter_p.h
@@ -50,6 +50,8 @@
//
// We mean it.
//
+
+#include <QtCore/private/qglobal_p.h>
#include <qjsonvalue.h>
QT_BEGIN_NAMESPACE