diff options
author | Moonchild <moonchild@palemoon.org> | 2021-02-05 12:44:26 +0000 |
---|---|---|
committer | Moonchild <moonchild@palemoon.org> | 2021-02-05 12:44:26 +0000 |
commit | 66d028942c3246f17f3f86ce40c230041556d27d (patch) | |
tree | fd948b4a70ddb224b0e95d6a11f0398e8601715e /js/src/frontend/TokenStream.cpp | |
parent | bd9fdeccc7f731450188dce4d7ec21643306988c (diff) | |
download | uxp-66d028942c3246f17f3f86ce40c230041556d27d.tar.gz |
Issue #1732 - Implement JSON superset proposal.
This change makes unicode line and paragraph separators allowed in JS strings,
removing the only quirk of the JS string definition that made JSON not a valid
subset of JS.
Resolves #1732
Diffstat (limited to 'js/src/frontend/TokenStream.cpp')
-rw-r--r-- | js/src/frontend/TokenStream.cpp | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/js/src/frontend/TokenStream.cpp b/js/src/frontend/TokenStream.cpp index d65511a8cc..7a253cc0e9 100644 --- a/js/src/frontend/TokenStream.cpp +++ b/js/src/frontend/TokenStream.cpp @@ -603,6 +603,10 @@ TokenStream::TokenBuf::findEOLMax(size_t start, size_t max) if (n >= max) break; n++; + + // This stops at U+2028 LINE SEPARATOR or U+2029 PARAGRAPH SEPARATOR in + // string and template literals. These code points do affect line and + // column coordinates, even as they encode their literal values. if (TokenBuf::isRawEOLChar(*p++)) break; } @@ -2129,8 +2133,9 @@ TokenStream::getStringOrTemplateToken(int untilChar, Token** tp) } break; } - } else if (TokenBuf::isRawEOLChar(c)) { + } else if (c == '\r' || c == '\n') { if (!parsingTemplate) { + // String literals don't allow ASCII line breaks. ungetCharIgnoreEOL(c); error(JSMSG_UNTERMINATED_STRING); return false; @@ -2138,10 +2143,18 @@ TokenStream::getStringOrTemplateToken(int untilChar, Token** tp) if (c == '\r') { c = '\n'; if (userbuf.peekRawChar() == '\n') + // Treat CRLF as a single line break. skipCharsIgnoreEOL(1); } updateLineInfoForEOL(); updateFlagsForEOL(); + } else if (c == LINE_SEPARATOR || c == PARA_SEPARATOR) { + // U+2028 LINE SEPARATOR and U+2029 PARAGRAPH SEPARATOR encode + // their literal values in template literals and (as of the + // JSON superset proposal) string literals, but they still count + // as line terminators when computing line/column coordinates. + updateLineInfoForEOL(); + updateFlagsForEOL(); } else if (parsingTemplate && c == '$') { if ((nc = getCharIgnoreEOL()) == '{') break; |