diff options
Diffstat (limited to 'src/corelib/json')
-rw-r--r-- | src/corelib/json/qjson.cpp | 4 | ||||
-rw-r--r-- | src/corelib/json/qjson_p.h | 20 | ||||
-rw-r--r-- | src/corelib/json/qjsondocument.cpp | 22 | ||||
-rw-r--r-- | src/corelib/json/qjsonparser.cpp | 15 | ||||
-rw-r--r-- | src/corelib/json/qjsonparser_p.h | 1 | ||||
-rw-r--r-- | src/corelib/json/qjsonvalue.cpp | 11 | ||||
-rw-r--r-- | src/corelib/json/qjsonwriter_p.h | 2 |
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 |