]> git.kaiwu.me - njs.git/commitdiff
Fixed tracking of argument scope.
authorDmitry Volyntsev <xeioex@nginx.com>
Sat, 8 Jun 2024 04:46:30 +0000 (21:46 -0700)
committerDmitry Volyntsev <xeioexception@gmail.com>
Mon, 10 Jun 2024 22:20:45 +0000 (15:20 -0700)
This properly catches unsupported "await" in arguments.

This fixes #730 issue on Github.

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

index 570d65c0c547fa368f7c01370c6043b49a15efe7..dbd9169f28e013c21ea23a9a0e51342b1113a1ad 100644 (file)
@@ -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;
     }
index 6e14647a734c70af43162403b950f35a85c95c23..c685d32c68504935b74325fb079fa1d1b70efb30 100644 (file)
@@ -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;
 };
 
 
index 830e68f3f2953f23fef5fb280d7864d1fd384537..c4b23c1dd766c08665abe749a9860cd455956d3d 100644 (file)
@@ -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) {}}"),