]> git.kaiwu.me - njs.git/commitdiff
Parser: fixed semicolon check after continue/break statement.
authorAlexander Borisov <alexander.borisov@nginx.com>
Mon, 15 Jun 2020 15:33:57 +0000 (18:33 +0300)
committerAlexander Borisov <alexander.borisov@nginx.com>
Mon, 15 Jun 2020 15:33:57 +0000 (18:33 +0300)
This closes #318 issue on GitHub.

src/njs_parser.c
src/test/njs_unit_test.c

index ad5d2defa6c5f4b82d39c1c57c6e0054a9cb0e19..61d76c9d90688b28cbabf156a0f13197763465f6 100644 (file)
@@ -5645,13 +5645,11 @@ njs_parser_break_continue(njs_parser_t *parser, njs_lexer_token_t *token,
         return njs_parser_failed(parser);
 
     default:
-        if (!parser->strict_semicolon
-            && parser->lexer->prev_type == NJS_TOKEN_LINE_END)
-        {
-            break;
-        }
-
         if (njs_lexer_token_is_label_identifier(token)) {
+            if (parser->lexer->prev_type == NJS_TOKEN_LINE_END) {
+                return njs_parser_stack_pop(parser);
+            }
+
             if (njs_label_find(parser->vm, parser->scope,
                                token->unique_id) == NULL)
             {
index c8fe0980e030fdad90027689e91cc2f45910832a..e11929bfe530c911a86a914ef6988d29f87a8ecd 100644 (file)
@@ -2828,6 +2828,9 @@ static njs_unit_test_t  njs_test[] =
     { njs_str("var i; for (i in [1,2,3]) {Object.seal({});}"),
       njs_str("undefined") },
 
+    { njs_str("while (0) {continue\n}"),
+      njs_str("undefined") },
+
     /* break. */
 
     { njs_str("break"),
@@ -2896,6 +2899,9 @@ static njs_unit_test_t  njs_test[] =
                  "for (i in a) if (a[i] > 4) break; s += a[i]; s"),
       njs_str("5") },
 
+    { njs_str("while (0) {break\n}"),
+      njs_str("undefined") },
+
     /* Labels. */
 
     { njs_str("var n = 0; a:{n++}; a:{n++}; n"),