/* Surrogate pair. */
if (utf > 0xdbff || p[0] != '\\' || p[1] != 'u') {
- njs_json_parse_exception(ctx, "Invalid Unicode char", p);
- return NULL;
+ s = nxt_utf8_encode(s, NXT_UTF8_REPLACEMENT);
+ continue;
}
p += 2;
utf_low = njs_json_unicode(p);
p += 4;
- if (nxt_slow_path(utf_low < 0xdc00 || utf_low > 0xdfff)) {
- njs_json_parse_exception(ctx, "Invalid surrogate pair", p);
- return NULL;
- }
+ if (nxt_fast_path(utf_low >= 0xdc00 && utf_low <= 0xdfff)) {
+ utf = njs_string_surrogate_pair(utf, utf_low);
- utf = njs_string_surrogate_pair(utf, utf_low);
+ } else if (utf_low >= 0xd800 && utf_low <= 0xdbff) {
+ utf = NXT_UTF8_REPLACEMENT;
+ s = nxt_utf8_encode(s, NXT_UTF8_REPLACEMENT);
+
+ } else {
+ utf = utf_low;
+ s = nxt_utf8_encode(s, NXT_UTF8_REPLACEMENT);
+ }
}
s = nxt_utf8_encode(s, utf);
nxt_string("SyntaxError: Unknown escape char at position 2") },
{ nxt_string("JSON.parse('\"\\\\uDC01\"')"),
- nxt_string("SyntaxError: Invalid Unicode char at position 7") },
+ nxt_string("�") },
{ nxt_string("JSON.parse('\"\\\\uD801\\\\uE000\"')"),
- nxt_string("SyntaxError: Invalid surrogate pair at position 13") },
+ nxt_string("�") },
+
+ { nxt_string("JSON.parse('\"\\\\uD83D\"')"),
+ nxt_string("�") },
+
+ { nxt_string("JSON.parse('\"\\\\uD800\\\\uDB00\"')"),
+ nxt_string("��") },
+
+ { nxt_string("JSON.parse('\"\\\\ud800[\"')"),
+ nxt_string("�[") },
{ nxt_string("JSON.parse('{')"),
nxt_string("SyntaxError: Unexpected end of input at position 1") },