details: https://hg.nginx.org/njs/rev/b9d18d4dd34e branches: changeset: 2138:b9d18d4dd34e user: Vadim Zhestikov <v.zhesti...@f5.com> date: Fri May 26 19:43:24 2023 -0700 description: Fixed parsing of for-in loops.
This fixes parsing for input like: for (a(b * in d) ; The issue was introduced in 283ae119d121 (0.7.9). diffstat: src/njs_parser.c | 35 ++++++++++++++++++++++++++--------- src/test/njs_unit_test.c | 6 ++++++ 2 files changed, 32 insertions(+), 9 deletions(-) diffs (92 lines): diff -r e74e56120102 -r b9d18d4dd34e src/njs_parser.c --- a/src/njs_parser.c Fri May 26 19:13:41 2023 -0700 +++ b/src/njs_parser.c Fri May 26 19:43:24 2023 -0700 @@ -294,7 +294,10 @@ static njs_int_t njs_parser_while_after( 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_p 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,8 +5515,19 @@ njs_parser_for_left_hand_side_expression 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 return njs_parser_after(parser, current, node, 0, njs_parser_for_in_statement_statement); } - } @@ -5766,8 +5777,14 @@ njs_parser_iteration_statement_for_map(n *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: diff -r e74e56120102 -r b9d18d4dd34e src/test/njs_unit_test.c --- a/src/test/njs_unit_test.c Fri May 26 19:13:41 2023 -0700 +++ b/src/test/njs_unit_test.c Fri May 26 19:43:24 2023 -0700 @@ -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"), _______________________________________________ nginx-devel mailing list nginx-devel@nginx.org https://mailman.nginx.org/mailman/listinfo/nginx-devel