]> git.kaiwu.me - njs.git/commitdiff
Fixed parsing case/default in an unclosed function block in switch.
authorAlexander Borisov <alexander.borisov@nginx.com>
Mon, 17 May 2021 17:35:35 +0000 (20:35 +0300)
committerAlexander Borisov <alexander.borisov@nginx.com>
Mon, 17 May 2021 17:35:35 +0000 (20:35 +0300)
src/njs_parser.c
src/test/njs_unit_test.c

index aaa99b636e0e7170a10177fb343dbf03c708c1e9..aef1ffe8ab0a2d3465590da67cc1d27e0efd3cea 100644 (file)
@@ -4713,7 +4713,10 @@ njs_parser_statement_list_next(njs_parser_t *parser, njs_lexer_token_t *token,
     if (parser->ret != NJS_OK) {
         if (token->type != NJS_TOKEN_CLOSE_BRACE) {
             parser->node = parser->target;
-            return njs_parser_stack_pop(parser);
+
+            (void) njs_parser_stack_pop(parser);
+
+            return parser->ret;
         }
 
         return njs_parser_failed(parser);
@@ -6098,6 +6101,10 @@ njs_parser_switch_case_block(njs_parser_t *parser, njs_lexer_token_t *token,
 {
     parser->target->right->right = parser->node;
 
+    if (parser->ret != NJS_OK && parser->target->scope != parser->scope) {
+        return njs_parser_failed(parser);
+    }
+
     njs_parser_next(parser, njs_parser_switch_case);
 
     return NJS_OK;
@@ -6153,6 +6160,10 @@ njs_parser_switch_case_block_wo_def(njs_parser_t *parser,
         parser->target->right = parser->node;
     }
 
+    if (parser->ret != NJS_OK && parser->target->scope != parser->scope) {
+        return njs_parser_failed(parser);
+    }
+
     njs_parser_next(parser, njs_parser_switch_case_wo_def);
 
     return NJS_OK;
index d003da778d2196356226f6f6be5ee0269ce7fa8c..529eea7e41cc3fe5794dfd6fa4a489d2fadfb882 100644 (file)
@@ -2958,6 +2958,24 @@ static njs_unit_test_t  njs_test[] =
               "map((v)=>{switch(v) { case isNaN: return 1; default: return 0;}})"),
       njs_str("1,0,0") },
 
+    { njs_str("switch (1) {case 1: ii > 1; ii => default:}"),
+      njs_str("SyntaxError: Unexpected token \"default\" in 1") },
+
+    { njs_str("switch (1) {case 1: ii > 1; var a = functin () {default:}"),
+      njs_str("SyntaxError: Unexpected token \"{\" in 1") },
+
+    { njs_str("switch (1) {default: ii > 1; ii => case 2:}"),
+      njs_str("SyntaxError: Unexpected token \"case\" in 1") },
+
+    { njs_str("switch (1) {default: ii > 1; var a = functin () {case 2:}"),
+      njs_str("SyntaxError: Unexpected token \"{\" in 1") },
+
+    { njs_str("switch (1) {case 1: ii > 1; ii => case 2:}"),
+      njs_str("SyntaxError: Unexpected token \"case\" in 1") },
+
+    { njs_str("switch (1) {case 1: ii > 1; var a = functin () {case 2:}"),
+      njs_str("SyntaxError: Unexpected token \"{\" in 1") },
+
     /* continue. */
 
     { njs_str("continue"),