summaryrefslogtreecommitdiff
path: root/js/src/frontend/TokenStream.cpp
diff options
context:
space:
mode:
authorMoonchild <moonchild@palemoon.org>2021-02-05 12:44:26 +0000
committerMoonchild <moonchild@palemoon.org>2021-02-05 12:44:26 +0000
commit66d028942c3246f17f3f86ce40c230041556d27d (patch)
treefd948b4a70ddb224b0e95d6a11f0398e8601715e /js/src/frontend/TokenStream.cpp
parentbd9fdeccc7f731450188dce4d7ec21643306988c (diff)
downloaduxp-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.cpp15
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;