From: Dmitry Volyntsev Date: Tue, 1 Sep 2026 04:49:27 +0000 (-0700) Subject: Parser: remove the dead cover parenthesized production X-Git-Tag: 1.0.2~85 X-Git-Url: https://git.kaiwu.me/?a=commitdiff_plain;h=35744a3ec85c2fe91d17e17c50d64ce5dd651f1c;p=njs.git Parser: remove the dead cover parenthesized production 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. --- diff --git a/src/njs_parser.c b/src/njs_parser.c index 0ee41ef6..370b4626 100644 --- a/src/njs_parser.c +++ b/src/njs_parser.c @@ -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. */