]> git.kaiwu.me - njs.git/commitdiff
Fixed parsing of for-statement.
authorVadim Zhestikov <v.zhestikov@f5.com>
Mon, 29 Jan 2024 16:57:48 +0000 (08:57 -0800)
committerVadim Zhestikov <v.zhestikov@f5.com>
Mon, 29 Jan 2024 16:57:48 +0000 (08:57 -0800)
src/njs_parser.c
src/test/njs_unit_test.c

index 6a7696b2dc0ac21a0cde1027df465c39536cfb6c..aa64cb4104c179588a4968974092c34a9fdbb1ed 100644 (file)
@@ -5490,24 +5490,10 @@ njs_parser_iteration_statement_for(njs_parser_t *parser,
 }
 
 
-static njs_int_t
-njs_parser_for_var_in_of_expression_chk_fail(njs_parser_t *parser,
-    njs_lexer_token_t *token, njs_queue_link_t *current)
-{
-    if (parser->ret != NJS_OK) {
-        return njs_parser_failed(parser);
-    }
-
-    return njs_parser_for_var_in_of_expression(parser, token, 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)
 {
-    njs_str_t  *text;
-
     if (parser->ret != NJS_OK && parser->node != NULL) {
         return njs_parser_failed(parser);
     }
@@ -5517,20 +5503,7 @@ njs_parser_for_expression_map_reparse(njs_parser_t *parser,
 
         njs_parser_next(parser, njs_parser_expression);
 
-        /*
-         * Here we pass not a node, but a token, this is important.
-         * This is necessary for correct error output.
-         */
-
-        text = njs_mp_alloc(parser->vm->mem_pool, sizeof(njs_str_t));
-        if (text == NULL) {
-            return NJS_ERROR;
-        }
-
-        *text = token->text;
-
-        return njs_parser_after(parser, current, text, 0,
-                                njs_parser_for_var_in_of_expression_chk_fail);
+        return NJS_OK;
     }
 
     return njs_parser_stack_pop(parser);
@@ -5793,14 +5766,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);
+        ret = njs_parser_after(parser, current, text, 0,
+                               njs_parser_for_expression_map_reparse);
         if (ret != NJS_OK) {
             return NJS_ERROR;
         }
 
-        return njs_parser_after(parser, current, text, 0,
-                                njs_parser_for_expression_map_reparse);
+        return njs_parser_after(parser, current, text, 1,
+                                njs_parser_for_expression_map_continue);
     }
 
 expression_after:
index 1c029f8fa5b46902d252a01330fae5c872f6c638..605418158a44d132420b6a69945e5e89dddf5f0e 100644 (file)
@@ -2975,6 +2975,9 @@ static njs_unit_test_t  njs_test[] =
     { njs_str("for(var``>0; 0 ;) ;"),
       njs_str("SyntaxError: Unexpected token \"`\" in 1") },
 
+    { njs_str("for(1;;)for(-x;;)fr({-x;;)f"),
+      njs_str("SyntaxError: Unexpected token \"-\" in 1") },
+
     { njs_str("for(i;;)for(-new+3;;)break;"),
       njs_str("SyntaxError: Unexpected token \"+\" in 1") },