]> git.kaiwu.me - njs.git/commitdiff
Parser: remove the dead cover parenthesized production
authorDmitry Volyntsev <xeioex@nginx.com>
Tue, 1 Sep 2026 04:49:27 +0000 (21:49 -0700)
committerDmitry Volyntsev <xeioexception@gmail.com>
Fri, 4 Sep 2026 20:56:37 +0000 (13:56 -0700)
Previously, njs_parser_cover_parenthesized_expression(), its two
continuations and njs_parser_binding_identifier_pattern() formed a closed
island: every reference to them came from inside it, and the only thing
linking it to the parser was a "(void)" cast left with a TODO in 2020.  It
honours neither contract this series introduces.  Two of its states are
reject landing states that never inspected parser->ret, so with a ")" or a
"," in hand they would consume the token and pop the stack after a reject.
Its parenthesized expression opens no [+In] region.

The fix is to delete the island rather than repair it.  Arrow parameters are
not going to be completed through this production, and the binding pattern
entry points it dispatched to are stubs reachable on their own.

src/njs_parser.c

index 0ee41ef6f289ec4c58d0fd0895740d90fa51e9b9..370b4626b67c42c15124b9659bb6cfa486da53be 100644 (file)
@@ -26,14 +26,6 @@ static njs_int_t njs_parser_template_literal_string(njs_parser_t *parser,
     njs_lexer_token_t *token, njs_queue_link_t *current);
 static njs_int_t njs_parser_template_literal_expression(
     njs_parser_t *parser, njs_lexer_token_t *token, njs_queue_link_t *current);
-static njs_int_t njs_parser_cover_parenthesized_expression(
-    njs_parser_t *parser, njs_lexer_token_t *token, njs_queue_link_t *current);
-static njs_int_t njs_parser_binding_identifier_pattern(njs_parser_t *parser,
-    njs_lexer_token_t *token, njs_queue_link_t *current);
-static njs_int_t njs_parser_cover_parenthesized_expression_after(
-    njs_parser_t *parser, njs_lexer_token_t *token, njs_queue_link_t *current);
-static njs_int_t njs_parser_cover_parenthesized_expression_end(
-    njs_parser_t *parser, njs_lexer_token_t *token, njs_queue_link_t *current);
 
 static njs_int_t njs_parser_array_literal(njs_parser_t *parser,
     njs_lexer_token_t *token, njs_queue_link_t *current);
@@ -1182,9 +1174,6 @@ njs_parser_primary_expression_test(njs_parser_t *parser,
     case NJS_TOKEN_OPEN_PARENTHESIS:
         njs_lexer_consume_token(parser->lexer, 1);
 
-        /* TODO: By specification. */
-        (void) njs_parser_cover_parenthesized_expression;
-
         parser->node = NULL;
 
         njs_parser_next(parser, njs_parser_expression);
@@ -1494,145 +1483,6 @@ njs_parser_template_literal_expression(njs_parser_t *parser,
 }
 
 
-static njs_int_t
-njs_parser_cover_parenthesized_expression(njs_parser_t *parser,
-    njs_lexer_token_t *token, njs_queue_link_t *current)
-{
-    switch (token->type) {
-    case NJS_TOKEN_CLOSE_PARENTHESIS:
-        (void) njs_parser_stack_pop(parser);
-        break;
-
-    case NJS_TOKEN_ELLIPSIS:
-        njs_parser_next(parser, njs_parser_binding_identifier_pattern);
-        break;
-
-    default:
-        parser->node = NULL;
-
-        njs_parser_next(parser, njs_parser_expression);
-
-        return njs_parser_after(parser, current, NULL, 0,
-                               njs_parser_cover_parenthesized_expression_after);
-    }
-
-    njs_lexer_consume_token(parser->lexer, 1);
-
-    return NJS_OK;
-}
-
-
-static njs_int_t
-njs_parser_binding_identifier_pattern(njs_parser_t *parser,
-    njs_lexer_token_t *token, njs_queue_link_t *current)
-{
-    /*
-     * BindingIdentifier )
-     * BindingPattern )
-     */
-
-    switch (token->type) {
-
-    /* BindingIdentifier */
-    case NJS_TOKEN_NAME:
-        njs_parser_next(parser, njs_parser_cover_parenthesized_expression_end);
-        break;
-
-    case NJS_TOKEN_YIELD:
-        njs_parser_next(parser, njs_parser_cover_parenthesized_expression_end);
-        break;
-
-    case NJS_TOKEN_AWAIT:
-        njs_parser_next(parser, njs_parser_cover_parenthesized_expression_end);
-        break;
-
-    /* BindingPattern */
-    case NJS_TOKEN_OPEN_BRACKET:
-        njs_parser_next(parser, njs_parser_array_binding_pattern);
-
-        njs_lexer_consume_token(parser->lexer, 1);
-        return njs_parser_after(parser, current, NULL, 0,
-                                njs_parser_cover_parenthesized_expression_end);
-
-    case NJS_TOKEN_OPEN_BRACE:
-        njs_parser_next(parser, njs_parser_object_binding_pattern);
-
-        njs_lexer_consume_token(parser->lexer, 1);
-        return njs_parser_after(parser, current, NULL, 0,
-                                njs_parser_cover_parenthesized_expression_end);
-
-    default:
-        return NJS_ERROR;
-    }
-
-    njs_lexer_consume_token(parser->lexer, 1);
-
-    return NJS_OK;
-}
-
-
-static njs_int_t
-njs_parser_cover_parenthesized_expression_after(njs_parser_t *parser,
-    njs_lexer_token_t *token, njs_queue_link_t *current)
-{
-    /*
-     * )
-     * ,)
-     * , ... BindingIdentifier )
-     * , ... BindingPattern )
-     */
-
-    if (token->type == NJS_TOKEN_CLOSE_PARENTHESIS) {
-        goto shift_stack;
-    }
-
-    if (token->type != NJS_TOKEN_COMMA) {
-        return njs_parser_failed(parser);
-    }
-
-    njs_lexer_consume_token(parser->lexer, 1);
-
-    token = njs_lexer_token(parser->lexer, 0);
-    if (njs_slow_path(token == NULL)) {
-        return NJS_ERROR;
-    }
-
-    if (token->type == NJS_TOKEN_CLOSE_PARENTHESIS) {
-        goto shift_stack;
-    }
-
-    if(token->type != NJS_TOKEN_ELLIPSIS) {
-        return njs_parser_failed(parser);
-    }
-
-    njs_lexer_consume_token(parser->lexer, 1);
-
-    njs_parser_next(parser, njs_parser_binding_identifier_pattern);
-
-    return NJS_OK;
-
-shift_stack:
-
-    njs_lexer_consume_token(parser->lexer, 1);
-
-    return njs_parser_stack_pop(parser);
-}
-
-
-static njs_int_t
-njs_parser_cover_parenthesized_expression_end(njs_parser_t *parser,
-    njs_lexer_token_t *token, njs_queue_link_t *current)
-{
-    if (token->type != NJS_TOKEN_CLOSE_PARENTHESIS) {
-        return njs_parser_failed(parser);
-    }
-
-    njs_lexer_consume_token(parser->lexer, 1);
-
-    return njs_parser_stack_pop(parser);
-}
-
-
 /*
  * 12.2.5 Array Initializer.
  */