Skip to content

Instantly share code, notes, and snippets.

@xeioex
Created February 13, 2019 18:12
Show Gist options
  • Save xeioex/f0aa2031f7897eec774b278777fc7b09 to your computer and use it in GitHub Desktop.
Save xeioex/f0aa2031f7897eec774b278777fc7b09 to your computer and use it in GitHub Desktop.
# HG changeset patch
# User Dmitry Volyntsev <[email protected]>
# Date 1550081459 -10800
# Wed Feb 13 21:10:59 2019 +0300
# Node ID ee25177ce448004e6c07cf504cc23c32fb309cc9
# Parent 03be823cd95bd3508e8a52dcef73aab763ff713a
Fixed parsing of string literals.
This closes #93 issue on Github.
diff --git a/njs/njs_lexer.c b/njs/njs_lexer.c
--- a/njs/njs_lexer.c
+++ b/njs/njs_lexer.c
@@ -530,11 +530,22 @@ njs_lexer_string(njs_lexer_t *lexer, u_c
}
p++;
+
+ /* Line continuation. */
+ if (p < lexer->end && p[-1] == '\r' && p[0] == '\n') {
+ p++;
+ }
+
escape = 1;
continue;
}
+ /* Line terminator. */
+ if (c == '\r' || c == '\n') {
+ break;
+ }
+
if (c == quote) {
lexer->start = p;
lexer->text.length = (p - 1) - lexer->text.start;
diff --git a/njs/test/njs_unit_test.c b/njs/test/njs_unit_test.c
--- a/njs/test/njs_unit_test.c
+++ b/njs/test/njs_unit_test.c
@@ -2863,7 +2863,7 @@ static njs_unit_test_t njs_test[] =
{ nxt_string("({[]:1})"),
nxt_string("SyntaxError: Unexpected token \"[\" in 1") },
- { nxt_string("({'AB\n\\cd':1})['AB\n\\cd']"),
+ { nxt_string("({'AB\\ncd':1})['AB\\ncd']"),
nxt_string("1") },
/* Inheritance. */
@@ -3935,9 +3935,24 @@ static njs_unit_test_t njs_test[] =
{ nxt_string("'\\a \\' \\\" \\\\ \\0 \\b \\f \\n \\r \\t \\v'"),
nxt_string("a ' \" \\ \0 \b \f \n \r \t \v") },
+ { nxt_string("'\\\n'"),
+ nxt_string("") },
+
+ { nxt_string("'\\\r'"),
+ nxt_string("") },
+
+ { nxt_string("'\\\r\n'"),
+ nxt_string("") },
+
{ nxt_string("'a\\\nb'"),
nxt_string("ab") },
+ { nxt_string("'a\\\r\nb'"),
+ nxt_string("ab") },
+
+ { nxt_string("'a\\\nb\nc'"),
+ nxt_string("SyntaxError: Unterminated string \"'a\\\nb\n\" in 1") },
+
{ nxt_string("'a\\\rb'"),
nxt_string("ab") },
@@ -3953,6 +3968,15 @@ static njs_unit_test_t njs_test[] =
{ nxt_string("'\\'"),
nxt_string("SyntaxError: Unterminated string \"'\\'\" in 1") },
+ { nxt_string("'a\n"),
+ nxt_string("SyntaxError: Unterminated string \"'a\n\" in 1") },
+
+ { nxt_string("'a\r"),
+ nxt_string("SyntaxError: Unterminated string \"'a\r\" in 1") },
+
+ { nxt_string("\"a\n"),
+ nxt_string("SyntaxError: Unterminated string \"\"a\n\" in 1") },
+
{ nxt_string("'\\u03B1'"),
nxt_string("α") },
@@ -10464,14 +10488,14 @@ static njs_unit_test_t njs_test[] =
{ nxt_string("JSON.stringify('α𐐀z'.repeat(10)).length"),
nxt_string("32") },
- { nxt_string("JSON.stringify('a\nbc')"),
+ { nxt_string("JSON.stringify('a\\nbc')"),
nxt_string("\"a\\nbc\"") },
{ nxt_string("JSON.stringify('а\tбв')"),
nxt_string("\"а\\tбв\"") },
- { nxt_string("JSON.stringify('\n\t\r\"\f\b ')"),
- nxt_string("\"\\n\\t\\r\\\"\\f\\b \"") },
+ { nxt_string("JSON.stringify('\\n\\t\\r\\\"\\f\\b')"),
+ nxt_string("\"\\n\\t\\r\\\"\\f\\b\"") },
{ nxt_string("JSON.stringify('\x00\x01\x02\x1f')"),
nxt_string("\"\\u0000\\u0001\\u0002\\u001F\"") },
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment