Vadim Zhestikov via nginx-devel
May 26, 2023 10:46PM
details: https://hg.nginx.org/njs/rev/b9d18d4dd34e
branches:
changeset: 2138:b9d18d4dd34e
user: Vadim Zhestikov <v.zhestikov@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
Subject Author Views Posted

[njs] Fixed parsing of for-in loops.

Vadim Zhestikov via nginx-devel 357 May 26, 2023 10:46PM



Sorry, you do not have permission to post/reply in this forum.

Online Users

Guests: 299
Record Number of Users: 8 on April 13, 2023
Record Number of Guests: 421 on December 02, 2018
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready