From: Dmitry Volyntsev Date: Sat, 8 Jun 2024 04:46:30 +0000 (-0700) Subject: Fixed tracking of argument scope. X-Git-Tag: 0.8.5~5 X-Git-Url: http://git.kaiwu.me/postgresql/log/contrib/postgres_fdw/static/gitweb.js?a=commitdiff_plain;h=9ade27b0f52bacb928d26dd970ff9e08c16bbef8;p=njs.git Fixed tracking of argument scope. This properly catches unsupported "await" in arguments. This fixes #730 issue on Github. --- diff --git a/src/njs_parser.c b/src/njs_parser.c index 570d65c0..dbd9169f 100644 --- a/src/njs_parser.c +++ b/src/njs_parser.c @@ -2827,7 +2827,7 @@ njs_parser_arguments(njs_parser_t *parser, njs_lexer_token_t *token, return njs_parser_stack_pop(parser); } - parser->scope->in_args = 1; + parser->scope->in_args++; njs_parser_next(parser, njs_parser_argument_list); @@ -2840,7 +2840,7 @@ static njs_int_t njs_parser_parenthesis_or_comma(njs_parser_t *parser, njs_lexer_token_t *token, njs_queue_link_t *current) { - parser->scope->in_args = 0; + parser->scope->in_args--; if (token->type == NJS_TOKEN_CLOSE_PARENTHESIS) { njs_lexer_consume_token(parser->lexer, 1); @@ -3575,7 +3575,7 @@ njs_parser_await(njs_parser_t *parser, njs_lexer_token_t *token, return NJS_ERROR; } - if (parser->scope->in_args) { + if (parser->scope->in_args > 0) { njs_parser_syntax_error(parser, "await in arguments not supported"); return NJS_ERROR; } diff --git a/src/njs_parser.h b/src/njs_parser.h index 6e14647a..c685d32c 100644 --- a/src/njs_parser.h +++ b/src/njs_parser.h @@ -26,7 +26,7 @@ struct njs_parser_scope_s { uint8_t arrow_function; uint8_t dest_disable; uint8_t async; - uint8_t in_args; + uint32_t in_args; }; diff --git a/src/test/njs_unit_test.c b/src/test/njs_unit_test.c index 830e68f3..c4b23c1d 100644 --- a/src/test/njs_unit_test.c +++ b/src/test/njs_unit_test.c @@ -19938,19 +19938,19 @@ static njs_unit_test_t njs_test[] = { njs_str("(async function() {console.log('Number: ' + await 111)})"), njs_str("SyntaxError: await in arguments not supported in 1") }, - { njs_str("function f(a) {}" - "(async function() {f(await 111)})"), + { njs_str("(async function() {f(await 111)})"), + njs_str("SyntaxError: await in arguments not supported in 1") }, + + { njs_str("(async function() {f(f(1), await 111)})"), njs_str("SyntaxError: await in arguments not supported in 1") }, { njs_str("async () => [await x(1)(),]; async () => [await x(1)()]"), njs_str("[object AsyncFunction]") }, - { njs_str("function f(a, b, c) {}" - "(async function() {f(1, 'a', await 111)})"), + { njs_str("(async function() {f(1, 'a', await 111)})"), njs_str("SyntaxError: await in arguments not supported in 1") }, - { njs_str("function f(a) {}" - "(async function() {f('Number: ' + await 111)})"), + { njs_str("(async function() {f('Number: ' + await 111)})"), njs_str("SyntaxError: await in arguments not supported in 1") }, { njs_str("async function f1() {try {f(await f1)} catch(e) {}}"),