]> git.kaiwu.me - njs.git/commitdiff
Add missed syntax error for await in template literal.
authorVadim Zhestikov <v.zhestikov@f5.com>
Tue, 11 Feb 2025 23:39:29 +0000 (15:39 -0800)
committerVadimZhestikov <108960056+VadimZhestikov@users.noreply.github.com>
Tue, 18 Feb 2025 17:34:40 +0000 (09:34 -0800)
This fixes issues #836 on github.

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

index 1f16336fd52618c609336ccc403c715c7dc5a9af..7fe596c2208c47448ef4e615f3b77ce707bd76c8 100644 (file)
@@ -2254,6 +2254,15 @@ njs_parser_initializer_assign(njs_parser_t *parser, njs_token_type_t type)
 }
 
 
+static njs_int_t
+njs_parser_tagged_template_literal_after(njs_parser_t *parser,
+    njs_lexer_token_t *token, njs_queue_link_t *current)
+{
+    parser->scope->in_tagged_template--;
+
+    return njs_parser_stack_pop(parser);
+}
+
 /*
  * 12.3 Left-Hand-Side Expressions.
  */
@@ -2334,9 +2343,12 @@ njs_parser_property(njs_parser_t *parser, njs_lexer_token_t *token,
 
         parser->node = node;
 
+        parser->scope->in_tagged_template++;
+
         njs_parser_next(parser, njs_parser_template_literal);
 
-        break;
+        return njs_parser_after(parser, current, node, 1,
+                                njs_parser_tagged_template_literal_after);
 
     default:
         return NJS_DONE;
@@ -3580,6 +3592,12 @@ njs_parser_await(njs_parser_t *parser, njs_lexer_token_t *token,
         return NJS_ERROR;
     }
 
+    if (parser->scope->in_tagged_template > 0) {
+        njs_parser_syntax_error(parser,
+                                "await in tagged template not supported");
+        return NJS_ERROR;
+    }
+
     node = njs_parser_node_new(parser, NJS_TOKEN_AWAIT);
     if (njs_slow_path(node == NULL)) {
         return NJS_ERROR;
index c685d32c68504935b74325fb079fa1d1b70efb30..db4db02dcfc5da41f3a764f1a2295d60c737cad3 100644 (file)
@@ -27,6 +27,7 @@ struct njs_parser_scope_s {
     uint8_t                         dest_disable;
     uint8_t                         async;
     uint32_t                        in_args;
+    uint32_t                        in_tagged_template;
 };
 
 
index e99a6d8aae33ad08eb74e1aeab3f1b5fb61a8254..4f5e5c910fa0829c6bc613da1d4df89f568c9cdf 100644 (file)
@@ -19821,6 +19821,12 @@ static njs_unit_test_t  njs_test[] =
     { njs_str("async function f1() {try {f(await f1)} catch(e) {}}"),
       njs_str("SyntaxError: await in arguments not supported in 1") },
 
+    { njs_str("(async () => (function (){}) `${(async () => 1)(await 1)}`)()"),
+      njs_str("SyntaxError: await in arguments not supported in 1") },
+
+    { njs_str("(async () => (function (){}) `${await 1}`)()"),
+      njs_str("SyntaxError: await in tagged template not supported in 1") },
+
     { njs_str("async function af() {await encrypt({},}"),
       njs_str("SyntaxError: Unexpected token \"}\" in 1") },