]> git.kaiwu.me - njs.git/commitdiff
Fixed parsing of for-in loops.
authorVadim Zhestikov <v.zhestikov@f5.com>
Sat, 27 May 2023 02:43:24 +0000 (19:43 -0700)
committerVadim Zhestikov <v.zhestikov@f5.com>
Sat, 27 May 2023 02:43:24 +0000 (19:43 -0700)
This fixes parsing for input like: for (a(b * in d) ;

The issue was introduced in 283ae119d121 (0.7.9).

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

index a9b8f92499aedcda35c4bb9f2077d5e2aa62abd5..5bf7316e99459e160ffee3a27019a146f3b217ed 100644 (file)
@@ -294,7 +294,10 @@ static njs_int_t njs_parser_while_after(njs_parser_t *parser,
 
 static njs_int_t njs_parser_iteration_statement_for(njs_parser_t *parser,
     njs_lexer_token_t *token, njs_queue_link_t *current);
-static njs_int_t njs_parser_for_left_hand_side_expression_map(
+static njs_int_t njs_parser_for_expression_map_continue(
+    njs_parser_t *parser, njs_lexer_token_t *token,
+    njs_queue_link_t *current);
+static njs_int_t njs_parser_for_expression_map_reparse(
     njs_parser_t *parser, njs_lexer_token_t *token,
     njs_queue_link_t *current);
 static njs_int_t njs_parser_expression_continue_op(njs_parser_t *parser,
@@ -5488,12 +5491,10 @@ njs_parser_iteration_statement_for(njs_parser_t *parser,
 
 
 static njs_int_t
-njs_parser_for_left_hand_side_expression_map(njs_parser_t *parser,
+njs_parser_for_expression_map_reparse(njs_parser_t *parser,
     njs_lexer_token_t *token, njs_queue_link_t *current)
 {
-    njs_int_t          operation;
-    njs_str_t          *text;
-    njs_parser_node_t  *node;
+    njs_str_t  *text;
 
     if (parser->node == NULL) {
         njs_lexer_in_fail_set(parser->lexer, 1);
@@ -5514,9 +5515,20 @@ njs_parser_for_left_hand_side_expression_map(njs_parser_t *parser,
 
         return njs_parser_after(parser, current, text, 1,
                                 njs_parser_for_var_in_of_expression);
-
     }
 
+    return njs_parser_stack_pop(parser);
+}
+
+
+static njs_int_t
+njs_parser_for_expression_map_continue(njs_parser_t *parser,
+    njs_lexer_token_t *token, njs_queue_link_t *current)
+{
+    njs_int_t          operation;
+    njs_str_t          *text;
+    njs_parser_node_t  *node;
+
     if (token->type != NJS_TOKEN_IN) {
         njs_lexer_in_fail_set(parser->lexer, 1);
 
@@ -5575,7 +5587,6 @@ njs_parser_for_left_hand_side_expression_map(njs_parser_t *parser,
         return njs_parser_after(parser, current, node, 0,
                                 njs_parser_for_in_statement_statement);
     }
-
 }
 
 
@@ -5766,8 +5777,14 @@ njs_parser_iteration_statement_for_map(njs_parser_t *parser,
 
         *text = token->text;
 
+        ret = njs_parser_after(parser, current, text, 1,
+                               njs_parser_for_expression_map_continue);
+        if (ret != NJS_OK) {
+            return NJS_ERROR;
+        }
+
         return njs_parser_after(parser, current, text, 0,
-                                njs_parser_for_left_hand_side_expression_map);
+                                njs_parser_for_expression_map_reparse);
     }
 
 expression_after:
index f8a83e401655b460c609bf592085313e2ef448d7..16deae14fa4c0fa9db931abb91a60ac01c75d16c 100644 (file)
@@ -2963,6 +2963,12 @@ static njs_unit_test_t  njs_test[] =
     { njs_str("for(A?{,"),
       njs_str("SyntaxError: Unexpected token \",\" in 1") },
 
+    { njs_str("for(Symbol(A=>A+       in 'A') P/$"),
+      njs_str("SyntaxError: Unexpected token \"in\" in 1") },
+
+    { njs_str("for (a(b * in d) ;"),
+      njs_str("SyntaxError: Unexpected token \"in\" in 1") },
+
     /* switch. */
 
     { njs_str("switch"),