Created
February 13, 2019 18:12
-
-
Save xeioex/f0aa2031f7897eec774b278777fc7b09 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # 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