}
if (cp_pair != 0) {
- cp = njs_string_surrogate_pair(cp_pair, cp);
+ if (nxt_fast_path(cp >= 0xdc00 && cp <= 0xdfff)) {
+ cp = njs_string_surrogate_pair(cp_pair, cp);
+
+ } else if (nxt_slow_path(cp >= 0xd800 && cp <= 0xdbff)) {
+ cp = NXT_UTF8_REPLACEMENT;
+
+ dst = nxt_utf8_encode(dst, (uint32_t) cp);
+
+ } else {
+ dst = nxt_utf8_encode(dst, NXT_UTF8_REPLACEMENT);
+ }
+
cp_pair = 0;
} else if (cp >= 0xd800 && cp <= 0xdfff) {
- cp_pair = cp;
- continue;
+ if (cp <= 0xdbff && src[0] == '\\' && src[1] == 'u') {
+ cp_pair = cp;
+ continue;
+ }
+
+ cp = NXT_UTF8_REPLACEMENT;
}
dst = nxt_utf8_encode(dst, (uint32_t) cp);
}
if (cp_pair != 0) {
- if (nxt_slow_path(cp < 0xdc00 || cp > 0xdfff)) {
- goto invalid_pair;
+ if (nxt_fast_path(cp >= 0xdc00 && cp <= 0xdfff)) {
+ cp = njs_string_surrogate_pair(cp_pair, cp);
+
+ } else if (nxt_slow_path(cp >= 0xd800 && cp <= 0xdbff)) {
+ cp = NXT_UTF8_REPLACEMENT;
+
+ size += nxt_utf8_size(cp);
+ length++;
+
+ } else {
+ size += nxt_utf8_size(NXT_UTF8_REPLACEMENT);
+ length++;
}
- cp = njs_string_surrogate_pair(cp_pair, cp);
cp_pair = 0;
} else if (cp >= 0xd800 && cp <= 0xdfff) {
- if (nxt_slow_path(cp > 0xdbff || src[0] != '\\' || src[1] != 'u')) {
- goto invalid_pair;
+ if (cp <= 0xdbff && src[0] == '\\' && src[1] == 'u') {
+ cp_pair = cp;
+ continue;
}
- cp_pair = cp;
- continue;
+ cp = NXT_UTF8_REPLACEMENT;
}
size += nxt_utf8_size(cp);
njs_parser_text(parser));
return NJS_ERROR;
-
-invalid_pair:
-
- njs_parser_syntax_error(vm, parser, "Invalid surrogate pair \"%V\"",
- njs_parser_text(parser));
-
- return NJS_ERROR;
}
nxt_string("1") },
{ nxt_string("'\\ud83d abc \\udc4d'"),
- nxt_string("SyntaxError: Invalid surrogate pair "
- "\"\\ud83d abc \\udc4d\" in 1") },
+ nxt_string("� abc �") },
{ nxt_string("'\\ud83d'"),
- nxt_string("SyntaxError: Invalid surrogate pair \"\\ud83d\" in 1") },
+ nxt_string("�") },
{ nxt_string("'\\ud83d\\uabcd'"),
- nxt_string("SyntaxError: Invalid surrogate pair "
- "\"\\ud83d\\uabcd\" in 1") },
+ nxt_string("�ꯍ") },
+
+ { nxt_string("'\\u{d800}\\u{dB00}'"),
+ nxt_string("��") },
+
+ { nxt_string("'\\u{d800}\\u{d7ff}'"),
+ nxt_string("�") },
+
+ { nxt_string("'\\u{d800}['"),
+ nxt_string("�[") },
+
+ { nxt_string("'\\u{D800}\\u{'"),
+ nxt_string("SyntaxError: Invalid Unicode code point \"\\u{D800}\\u{\" in 1") },
{ nxt_string("''.hasOwnProperty('length')"),
nxt_string("true") },