]> git.kaiwu.me - njs.git/commitdiff
Fixed parsing of string literals.
authorDmitry Volyntsev <xeioex@nginx.com>
Thu, 14 Feb 2019 11:40:50 +0000 (14:40 +0300)
committerDmitry Volyntsev <xeioex@nginx.com>
Thu, 14 Feb 2019 11:40:50 +0000 (14:40 +0300)
This closes #93 issue on Github.

njs/njs_lexer.c
njs/test/njs_unit_test.c

index 469499bdd27f42787f811ceb7fee4025d2649d98..388535156462d6faac342079a6c33345789390e5 100644 (file)
@@ -530,11 +530,22 @@ njs_lexer_string(njs_lexer_t *lexer, u_char quote)
             }
 
             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;
index 74d92313b95384d65793dba94b533b99e47a8c38..04164ec489f3555ee4396c1078ca1f839f5ceadf 100644 (file)
@@ -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,6 +3935,15 @@ 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") },
 
@@ -3944,15 +3953,33 @@ static njs_unit_test_t  njs_test[] =
     { nxt_string("'a\\\r\nb'"),
       nxt_string("ab") },
 
+    { nxt_string("'a\\\n\rb'"),
+      nxt_string("SyntaxError: Unterminated string \"'a\\\n\r\" in 1") },
+
+    { nxt_string("'a\\\nb\nc'"),
+      nxt_string("SyntaxError: Unterminated string \"'a\\\nb\n\" in 1") },
+
     { nxt_string("'abcde"),
       nxt_string("SyntaxError: Unterminated string \"'abcde\" in 1") },
 
     { nxt_string("'\\"),
       nxt_string("SyntaxError: Unterminated string \"'\\\" in 1") },
 
+    { nxt_string("'\\\r\n"),
+      nxt_string("SyntaxError: Unterminated string \"'\\\r\n\" in 1") },
+
     { 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 +10491,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\"") },