aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/jsruntime/qv4jsonobject.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/qml/jsruntime/qv4jsonobject.cpp')
-rw-r--r--src/qml/jsruntime/qv4jsonobject.cpp65
1 files changed, 34 insertions, 31 deletions
diff --git a/src/qml/jsruntime/qv4jsonobject.cpp b/src/qml/jsruntime/qv4jsonobject.cpp
index 331b528409..458b46b36e 100644
--- a/src/qml/jsruntime/qv4jsonobject.cpp
+++ b/src/qml/jsruntime/qv4jsonobject.cpp
@@ -612,10 +612,9 @@ bool JsonParser::parseString(QString *string)
lastError = QJsonParseError::IllegalEscapeSequence;
return false;
}
- qDebug() << "scanEscape" << hex << ch;
if (QChar::requiresSurrogates(ch)) {
- *string += QChar::highSurrogate(ch);
- *string += QChar::lowSurrogate(ch);
+ *string += QChar(QChar::highSurrogate(ch));
+ *string += QChar(QChar::lowSurrogate(ch));
} else {
*string += QChar(ch);
}
@@ -661,42 +660,42 @@ struct Stringify
static QString quote(const QString &str)
{
- QString product = "\"";
+ QString product = QStringLiteral("\"");
for (int i = 0; i < str.length(); ++i) {
QChar c = str.at(i);
switch (c.unicode()) {
case '"':
- product += "\\\"";
+ product += QStringLiteral("\\\"");
break;
case '\\':
- product += "\\\\";
+ product += QStringLiteral("\\\\");
break;
case '\b':
- product += "\\b";
+ product += QStringLiteral("\\b");
break;
case '\f':
- product += "\\f";
+ product += QStringLiteral("\\f");
break;
case '\n':
- product += "\\n";
+ product += QStringLiteral("\\n");
break;
case '\r':
- product += "\\r";
+ product += QStringLiteral("\\r");
break;
case '\t':
- product += "\\t";
+ product += QStringLiteral("\\t");
break;
default:
if (c.unicode() <= 0x1f) {
- product += "\\u00";
- product += c.unicode() > 0xf ? '1' : '0';
- product += "0123456789abcdef"[c.unicode() & 0xf];
+ product += QStringLiteral("\\u00");
+ product += c.unicode() > 0xf ? QLatin1Char('1') : QLatin1Char('0');
+ product += QLatin1Char("0123456789abcdef"[c.unicode() & 0xf]);
} else {
product += c;
}
}
}
- product += '"';
+ product += QLatin1Char('"');
return product;
}
@@ -768,9 +767,9 @@ QString Stringify::makeMember(const QString &key, ValueRef v)
{
QString strP = Str(key, v);
if (!strP.isEmpty()) {
- QString member = quote(key) + ':';
+ QString member = quote(key) + QLatin1Char(':');
if (!gap.isEmpty())
- member += ' ';
+ member += QLatin1Char(' ');
member += strP;
return member;
}
@@ -779,8 +778,10 @@ QString Stringify::makeMember(const QString &key, ValueRef v)
QString Stringify::JO(ObjectRef o)
{
- if (stack.contains(o.getPointer()))
+ if (stack.contains(o.getPointer())) {
ctx->throwTypeError();
+ return QString();
+ }
Scope scope(ctx);
@@ -799,7 +800,7 @@ QString Stringify::JO(ObjectRef o)
name = it.nextPropertyNameAsString(val);
if (name->isNull())
break;
- QString key = name->toQStringNoThrow();
+ QString key = name->toQString();
QString member = makeMember(key, val);
if (!member.isEmpty())
partial += member;
@@ -821,10 +822,10 @@ QString Stringify::JO(ObjectRef o)
if (partial.isEmpty()) {
result = QStringLiteral("{}");
} else if (gap.isEmpty()) {
- result = "{" + partial.join(",") + "}";
+ result = QStringLiteral("{") + partial.join(QLatin1Char(',')) + QStringLiteral("}");
} else {
- QString separator = ",\n" + indent;
- result = "{\n" + indent + partial.join(separator) + "\n" + stepback + "}";
+ QString separator = QStringLiteral(",\n") + indent;
+ result = QStringLiteral("{\n") + indent + partial.join(separator) + QStringLiteral("\n") + stepback + QStringLiteral("}");
}
indent = stepback;
@@ -834,8 +835,10 @@ QString Stringify::JO(ObjectRef o)
QString Stringify::JA(ArrayObjectRef a)
{
- if (stack.contains(a.getPointer()))
+ if (stack.contains(a.getPointer())) {
ctx->throwTypeError();
+ return QString();
+ }
Scope scope(a->engine());
@@ -864,10 +867,10 @@ QString Stringify::JA(ArrayObjectRef a)
if (partial.isEmpty()) {
result = QStringLiteral("[]");
} else if (gap.isEmpty()) {
- result = "[" + partial.join(",") + "]";
+ result = QStringLiteral("[") + partial.join(QLatin1Char(',')) + QStringLiteral("]");
} else {
- QString separator = ",\n" + indent;
- result = "[\n" + indent + partial.join(separator) + "\n" + stepback + "]";
+ QString separator = QStringLiteral(",\n") + indent;
+ result = QStringLiteral("[\n") + indent + partial.join(separator) + QStringLiteral("\n") + stepback + QStringLiteral("]");
}
indent = stepback;
@@ -889,7 +892,7 @@ JsonObject::JsonObject(ExecutionEngine *engine)
}
-ReturnedValue JsonObject::method_parse(SimpleCallContext *ctx)
+ReturnedValue JsonObject::method_parse(CallContext *ctx)
{
Scope scope(ctx);
ScopedValue v(scope, ctx->argument(0));
@@ -901,13 +904,13 @@ ReturnedValue JsonObject::method_parse(SimpleCallContext *ctx)
ScopedValue result(scope, parser.parse(&error));
if (error.error != QJsonParseError::NoError) {
DEBUG << "parse error" << error.errorString();
- ctx->throwSyntaxError("JSON.parse: Parse error");
+ return ctx->throwSyntaxError(QStringLiteral("JSON.parse: Parse error"));
}
return result.asReturnedValue();
}
-ReturnedValue JsonObject::method_stringify(SimpleCallContext *ctx)
+ReturnedValue JsonObject::method_stringify(CallContext *ctx)
{
Scope scope(ctx);
@@ -922,7 +925,7 @@ ReturnedValue JsonObject::method_stringify(SimpleCallContext *ctx)
for (uint i = 0; i < arrayLen; ++i) {
v = o->getIndexed(i);
if (v->asNumberObject() || v->asStringObject() || v->isNumber())
- v = __qmljs_to_string(v, ctx);
+ v = __qmljs_to_string(ctx, v);
if (v->isString()) {
String *s = v->stringValue();
if (!stringify.propertyList.contains(s))
@@ -947,7 +950,7 @@ ReturnedValue JsonObject::method_stringify(SimpleCallContext *ctx)
ScopedValue arg0(scope, ctx->argument(0));
QString result = stringify.Str(QString(), arg0);
- if (result.isEmpty())
+ if (result.isEmpty() || scope.engine->hasException)
return Encode::undefined();
return ctx->engine->newString(result)->asReturnedValue();
}