summaryrefslogtreecommitdiffstats
path: root/src/corelib/json
diff options
context:
space:
mode:
authorOswald Buddenhagen <oswald.buddenhagen@nokia.com>2012-04-10 12:48:01 +0200
committerOswald Buddenhagen <oswald.buddenhagen@nokia.com>2012-04-10 15:31:45 +0200
commit143c4d3e13a430b951f4f4f8c28db14303f80605 (patch)
tree2b89637b93fc7d81c674106008566010f986d67c /src/corelib/json
parenta7ed81b557d593a8ddb43b71bf4bbf3b44ead070 (diff)
parente5337ad1b1fb02873ce7b5ca8db45f6fd8063352 (diff)
Merge remote-tracking branch 'origin/master' into api_changes
Conflicts: configure src/widgets/styles/qwindowsxpstyle.cpp tests/auto/gui/kernel/qwindow/qwindow.pro tests/auto/gui/kernel/qwindow/tst_qwindow.cpp Change-Id: I624b6d26abce9874c610c04954c1c45bc074bef3
Diffstat (limited to 'src/corelib/json')
-rw-r--r--src/corelib/json/qjson_p.h2
-rw-r--r--src/corelib/json/qjsonarray.cpp4
-rw-r--r--src/corelib/json/qjsondocument.cpp13
-rw-r--r--src/corelib/json/qjsondocument.h10
-rw-r--r--src/corelib/json/qjsonobject.cpp6
-rw-r--r--src/corelib/json/qjsonparser.cpp93
6 files changed, 105 insertions, 23 deletions
diff --git a/src/corelib/json/qjson_p.h b/src/corelib/json/qjson_p.h
index f8f41c2e25..831774e456 100644
--- a/src/corelib/json/qjson_p.h
+++ b/src/corelib/json/qjson_p.h
@@ -745,7 +745,7 @@ public:
Data *clone(Base *b, int reserve = 0)
{
int size = sizeof(Header) + b->size;
- if (ref.load() == 1 && alloc >= size + reserve)
+ if (b == header->root() && ref.load() == 1 && alloc >= size + reserve)
return this;
if (reserve) {
diff --git a/src/corelib/json/qjsonarray.cpp b/src/corelib/json/qjsonarray.cpp
index 6bae2001a1..d143215efd 100644
--- a/src/corelib/json/qjsonarray.cpp
+++ b/src/corelib/json/qjsonarray.cpp
@@ -275,7 +275,7 @@ void QJsonArray::removeAt(int i)
detach();
a->removeItems(i, 1);
++d->compactionCounter;
- if (d->compactionCounter > 32 && d->compactionCounter >= (int)a->length/2)
+ if (d->compactionCounter > 32u && d->compactionCounter >= unsigned(a->length) / 2u)
compact();
}
@@ -379,7 +379,7 @@ void QJsonArray::replace(int i, const QJsonValue &value)
QJsonPrivate::Value::copyData(value, (char *)a + valueOffset, compressed);
++d->compactionCounter;
- if (d->compactionCounter > 32 && d->compactionCounter >= (int)a->length/2)
+ if (d->compactionCounter > 32u && d->compactionCounter >= unsigned(a->length) / 2u)
compact();
}
diff --git a/src/corelib/json/qjsondocument.cpp b/src/corelib/json/qjsondocument.cpp
index c2204bf696..be241bc3fc 100644
--- a/src/corelib/json/qjsondocument.cpp
+++ b/src/corelib/json/qjsondocument.cpp
@@ -224,23 +224,26 @@ const char *QJsonDocument::rawData(int *size) const
*/
QJsonDocument QJsonDocument::fromBinaryData(const QByteArray &data, DataValidation validation)
{
+ if (data.size() < (int)(sizeof(QJsonPrivate::Header) + sizeof(QJsonPrivate::Base)))
+ return QJsonDocument();
+
QJsonPrivate::Header h;
memcpy(&h, data.constData(), sizeof(QJsonPrivate::Header));
QJsonPrivate::Base root;
memcpy(&root, data.constData() + sizeof(QJsonPrivate::Header), sizeof(QJsonPrivate::Base));
// do basic checks here, so we don't try to allocate more memory than we can.
- if (data.size() < (int)(sizeof(QJsonPrivate::Header) + sizeof(QJsonPrivate::Base)) ||
- h.tag != QJsonDocument::BinaryFormatTag || h.version != 1u ||
+ if (h.tag != QJsonDocument::BinaryFormatTag || h.version != 1u ||
sizeof(QJsonPrivate::Header) + root.size > (uint)data.size())
return QJsonDocument();
- char *raw = (char *)malloc(data.size());
+ const uint size = sizeof(QJsonPrivate::Header) + root.size;
+ char *raw = (char *)malloc(size);
if (!raw)
return QJsonDocument();
- memcpy(raw, data.constData(), data.size());
- QJsonPrivate::Data *d = new QJsonPrivate::Data(raw, data.size());
+ memcpy(raw, data.constData(), size);
+ QJsonPrivate::Data *d = new QJsonPrivate::Data(raw, size);
if (validation != BypassValidation && !d->valid()) {
delete d;
diff --git a/src/corelib/json/qjsondocument.h b/src/corelib/json/qjsondocument.h
index e39dc6a27c..c67899192c 100644
--- a/src/corelib/json/qjsondocument.h
+++ b/src/corelib/json/qjsondocument.h
@@ -63,14 +63,16 @@ struct Q_CORE_EXPORT QJsonParseError
UnterminatedArray,
MissingValueSeparator,
IllegalValue,
- EndOfNumber,
+ TerminationByNumber,
IllegalNumber,
- StringEscapeSequence,
- StringUTF8Scan,
- EndOfString,
+ IllegalEscapeSequence,
+ IllegalUTF8String,
+ UnterminatedString,
MissingObject
};
+ QString errorString() const;
+
int offset;
ParseError error;
};
diff --git a/src/corelib/json/qjsonobject.cpp b/src/corelib/json/qjsonobject.cpp
index e14000fac3..e880078195 100644
--- a/src/corelib/json/qjsonobject.cpp
+++ b/src/corelib/json/qjsonobject.cpp
@@ -335,7 +335,7 @@ void QJsonObject::remove(const QString &key)
detach();
o->removeItems(index, 1);
++d->compactionCounter;
- if (d->compactionCounter > 32 && d->compactionCounter >= (int)o->length/2)
+ if (d->compactionCounter > 32u && d->compactionCounter >= unsigned(o->length) / 2u)
compact();
}
@@ -361,7 +361,7 @@ QJsonValue QJsonObject::take(const QString &key)
QJsonPrivate::Entry *e = o->entryAt(index);
o->removeItems(index, 1);
++d->compactionCounter;
- if (d->compactionCounter > 32 && d->compactionCounter >= (int)o->length/2)
+ if (d->compactionCounter > 32u && d->compactionCounter >= unsigned(o->length) / 2u)
compact();
return QJsonValue(d, o, e->value);
@@ -432,7 +432,7 @@ QJsonObject::iterator QJsonObject::erase(QJsonObject::iterator it)
o->removeItems(index, 1);
++d->compactionCounter;
- if (d->compactionCounter > 32 && d->compactionCounter >= (int)o->length/2)
+ if (d->compactionCounter > 32u && d->compactionCounter >= unsigned(o->length) / 2u)
compact();
// iterator hasn't changed
diff --git a/src/corelib/json/qjsonparser.cpp b/src/corelib/json/qjsonparser.cpp
index b1e6a5a5c7..9b11c9ac3e 100644
--- a/src/corelib/json/qjsonparser.cpp
+++ b/src/corelib/json/qjsonparser.cpp
@@ -39,6 +39,9 @@
**
****************************************************************************/
+#ifndef QT_BOOTSTRAPPED
+#include <qcoreapplication.h>
+#endif
#include <qdebug.h>
#include "qjsonparser_p.h"
#include "qjson_p.h"
@@ -57,6 +60,80 @@ static int indent = 0;
QT_BEGIN_NAMESPACE
+// error strings for the JSON parser
+#define JSONERR_OK QT_TRANSLATE_NOOP("QJsonParseError", "no error occurred")
+#define JSONERR_UNTERM_OBJ QT_TRANSLATE_NOOP("QJsonParseError", "unterminated object")
+#define JSONERR_MISS_NSEP QT_TRANSLATE_NOOP("QJsonParseError", "missing name separator")
+#define JSONERR_UNTERM_AR QT_TRANSLATE_NOOP("QJsonParseError", "unterminated array")
+#define JSONERR_MISS_VSEP QT_TRANSLATE_NOOP("QJsonParseError", "missing value separator")
+#define JSONERR_ILLEGAL_VAL QT_TRANSLATE_NOOP("QJsonParseError", "illegal value")
+#define JSONERR_END_OF_NUM QT_TRANSLATE_NOOP("QJsonParseError", "invalid termination by number")
+#define JSONERR_ILLEGAL_NUM QT_TRANSLATE_NOOP("QJsonParseError", "illegal number")
+#define JSONERR_STR_ESC_SEQ QT_TRANSLATE_NOOP("QJsonParseError", "invalid escape sequence")
+#define JSONERR_STR_UTF8 QT_TRANSLATE_NOOP("QJsonParseError", "invalid UTF8 string")
+#define JSONERR_UTERM_STR QT_TRANSLATE_NOOP("QJsonParseError", "unterminated string")
+#define JSONERR_MISS_OBJ QT_TRANSLATE_NOOP("QJsonParseError", "object is missing after a comma")
+
+/*!
+ \class QJsonParseError
+ \ingroup json
+ \reentrant
+ \since 5.0
+
+ \brief The QJsonParseError class is used to report errors during JSON parsing.
+*/
+
+/*!
+ Returns the human-readable message appropriate to the reported JSON parsing error.
+ */
+QString QJsonParseError::errorString() const
+{
+ const char *sz = "";
+ switch (error) {
+ case NoError:
+ sz = JSONERR_OK;
+ break;
+ case UnterminatedObject:
+ sz = JSONERR_UNTERM_OBJ;
+ break;
+ case MissingNameSeparator:
+ sz = JSONERR_MISS_NSEP;
+ break;
+ case UnterminatedArray:
+ sz = JSONERR_UNTERM_AR;
+ break;
+ case MissingValueSeparator:
+ sz = JSONERR_MISS_VSEP;
+ break;
+ case IllegalValue:
+ sz = JSONERR_ILLEGAL_VAL;
+ break;
+ case TerminationByNumber:
+ sz = JSONERR_END_OF_NUM;
+ break;
+ case IllegalNumber:
+ sz = JSONERR_ILLEGAL_NUM;
+ break;
+ case IllegalEscapeSequence:
+ sz = JSONERR_STR_ESC_SEQ;
+ break;
+ case IllegalUTF8String:
+ sz = JSONERR_STR_UTF8;
+ break;
+ case UnterminatedString:
+ sz = JSONERR_UTERM_STR;
+ break;
+ case MissingObject:
+ sz = JSONERR_MISS_OBJ;
+ break;
+ }
+#ifndef QT_BOOTSTRAPPED
+ return QCoreApplication::translate("QJsonParseError", sz);
+#else
+ return QLatin1String(sz);
+#endif
+}
+
using namespace QJsonPrivate;
Parser::Parser(const char *json, int length)
@@ -524,7 +601,7 @@ bool Parser::parseNumber(QJsonPrivate::Value *val, int baseOffset)
}
if (json >= end) {
- lastError = QJsonParseError::EndOfNumber;
+ lastError = QJsonParseError::TerminationByNumber;
return false;
}
@@ -717,12 +794,12 @@ bool Parser::parseString(bool *latin1)
break;
else if (*json == '\\') {
if (!scanEscapeSequence(json, end, &ch)) {
- lastError = QJsonParseError::StringEscapeSequence;
+ lastError = QJsonParseError::IllegalEscapeSequence;
return false;
}
} else {
if (!scanUtf8Char(json, end, &ch)) {
- lastError = QJsonParseError::StringUTF8Scan;
+ lastError = QJsonParseError::IllegalUTF8String;
return false;
}
}
@@ -737,14 +814,14 @@ bool Parser::parseString(bool *latin1)
++json;
DEBUG << "end of string";
if (json >= end) {
- lastError = QJsonParseError::EndOfString;
+ lastError = QJsonParseError::UnterminatedString;
return false;
}
// no unicode string, we are done
if (*latin1) {
// write string length
- *(QJsonPrivate::qle_ushort *)(data + stringPos) = current - outStart - sizeof(ushort);
+ *(QJsonPrivate::qle_ushort *)(data + stringPos) = ushort(current - outStart - sizeof(ushort));
int pos = reserveSpace((4 - current) & 3);
while (pos & 3)
data[pos++] = 0;
@@ -764,12 +841,12 @@ bool Parser::parseString(bool *latin1)
break;
else if (*json == '\\') {
if (!scanEscapeSequence(json, end, &ch)) {
- lastError = QJsonParseError::StringEscapeSequence;
+ lastError = QJsonParseError::IllegalEscapeSequence;
return false;
}
} else {
if (!scanUtf8Char(json, end, &ch)) {
- lastError = QJsonParseError::StringUTF8Scan;
+ lastError = QJsonParseError::IllegalUTF8String;
return false;
}
}
@@ -785,7 +862,7 @@ bool Parser::parseString(bool *latin1)
++json;
if (json >= end) {
- lastError = QJsonParseError::EndOfString;
+ lastError = QJsonParseError::UnterminatedString;
return false;
}