]> git.kaiwu.me - njs.git/commitdiff
Parser: fixed return statement parsing with invalid expression.
authorVadim Zhestikov <v.zhestikov@f5.com>
Tue, 24 Oct 2023 04:19:03 +0000 (21:19 -0700)
committerVadim Zhestikov <v.zhestikov@f5.com>
Tue, 24 Oct 2023 04:19:03 +0000 (21:19 -0700)
src/njs_parser.c
src/test/njs_unit_test.c

index 5b1b2aa7866f250da44a33b4a41ea8c227a2fe71..f47b80b64987a392a9bfc6a05c0c323057b88453 100644 (file)
@@ -6347,10 +6347,12 @@ njs_parser_return_statement(njs_parser_t *parser, njs_lexer_token_t *token,
 
         parser->node = NULL;
 
-        njs_parser_next(parser, njs_parser_expression);
+        if (token->type != NJS_TOKEN_CLOSE_BRACE) {
+            njs_parser_next(parser, njs_parser_expression);
 
-        return njs_parser_after(parser, current, node, 0,
-                                njs_parser_return_statement_after);
+            return njs_parser_after(parser, current, node, 0,
+                                    njs_parser_return_statement_after);
+        }
     }
 
     parser->node = node;
@@ -6364,8 +6366,9 @@ njs_parser_return_statement_after(njs_parser_t *parser,
     njs_lexer_token_t *token, njs_queue_link_t *current)
 {
     if (parser->ret != NJS_OK) {
-        parser->node = parser->target;
-        return njs_parser_stack_pop(parser);
+        njs_parser_syntax_error(parser, "Unexpected token \"%V\"",
+                                &token->text);
+        return NJS_DONE;
     }
 
     if (njs_parser_expect_semicolon(parser, token) != NJS_OK) {
index bec1f53f0f80be63e293f09e7693976787241cf3..014f8103729835fcfbeb7b6e02969c8a8276f33e 100644 (file)
@@ -10093,6 +10093,15 @@ static njs_unit_test_t  njs_test[] =
     { njs_str("\n{\nreturn;\n}"),
       njs_str("SyntaxError: Illegal return statement in 3") },
 
+    { njs_str("function f () {return a +}"),
+      njs_str("SyntaxError: Unexpected token \"}\" in 1") },
+
+    { njs_str("`${function(){return n=>}}`"),
+      njs_str("SyntaxError: Unexpected token \"}\" in 1") },
+
+    { njs_str("(function(){return a +})"),
+      njs_str("SyntaxError: Unexpected token \"}\" in 1") },
+
     { njs_str("if (1) function f(){}"),
       njs_str("SyntaxError: Functions can only be declared at top level or inside a block in 1") },