| Index: src/parsing/preparser.cc
|
| diff --git a/src/parsing/preparser.cc b/src/parsing/preparser.cc
|
| index 027b75deda3bfd54f12a6d2a1ea149118ac128a9..cf0a5ee6c4504076b4a05c4feb90f0a441f19622 100644
|
| --- a/src/parsing/preparser.cc
|
| +++ b/src/parsing/preparser.cc
|
| @@ -164,175 +164,6 @@ PreParser::Statement PreParser::ParseFunctionDeclaration(bool* ok) {
|
| return ParseHoistableDeclaration(pos, flags, nullptr, false, ok);
|
| }
|
|
|
| -PreParser::Statement PreParser::ParseExpressionOrLabelledStatement(
|
| - ZoneList<const AstRawString*>* names,
|
| - AllowLabelledFunctionStatement allow_function, bool* ok) {
|
| - // ExpressionStatement | LabelledStatement ::
|
| - // Expression ';'
|
| - // Identifier ':' Statement
|
| -
|
| - switch (peek()) {
|
| - case Token::FUNCTION:
|
| - case Token::LBRACE:
|
| - UNREACHABLE(); // Always handled by the callers.
|
| - case Token::CLASS:
|
| - ReportUnexpectedToken(Next());
|
| - *ok = false;
|
| - return Statement::Default();
|
| -
|
| - default:
|
| - break;
|
| - }
|
| -
|
| - bool starts_with_identifier = peek_any_identifier();
|
| - ExpressionClassifier classifier(this);
|
| - Expression expr = ParseExpressionCoverGrammar(true, CHECK_OK);
|
| - ValidateExpression(CHECK_OK);
|
| -
|
| - // Even if the expression starts with an identifier, it is not necessarily an
|
| - // identifier. For example, "foo + bar" starts with an identifier but is not
|
| - // an identifier.
|
| - if (starts_with_identifier && expr.IsIdentifier() && peek() == Token::COLON) {
|
| - // Expression is a single identifier, and not, e.g., a parenthesized
|
| - // identifier.
|
| - DCHECK(!expr.AsIdentifier().IsEnum());
|
| - DCHECK(!parsing_module_ || !expr.AsIdentifier().IsAwait());
|
| - DCHECK(is_sloppy(language_mode()) ||
|
| - !IsFutureStrictReserved(expr.AsIdentifier()));
|
| - Consume(Token::COLON);
|
| - // ES#sec-labelled-function-declarations Labelled Function Declarations
|
| - if (peek() == Token::FUNCTION && is_sloppy(language_mode())) {
|
| - if (allow_function == kAllowLabelledFunctionStatement) {
|
| - return ParseFunctionDeclaration(ok);
|
| - } else {
|
| - return ParseScopedStatement(names, true, ok);
|
| - }
|
| - }
|
| - Statement statement =
|
| - ParseStatement(nullptr, kDisallowLabelledFunctionStatement, ok);
|
| - return statement.IsJumpStatement() ? Statement::Default() : statement;
|
| - // Preparsing is disabled for extensions (because the extension details
|
| - // aren't passed to lazily compiled functions), so we don't
|
| - // accept "native function" in the preparser.
|
| - }
|
| - // Parsed expression statement.
|
| - ExpectSemicolon(CHECK_OK);
|
| - return Statement::ExpressionStatement(expr);
|
| -}
|
| -
|
| -PreParser::Statement PreParser::ParseIfStatement(
|
| - ZoneList<const AstRawString*>* labels, bool* ok) {
|
| - // IfStatement ::
|
| - // 'if' '(' Expression ')' Statement ('else' Statement)?
|
| -
|
| - Expect(Token::IF, CHECK_OK);
|
| - Expect(Token::LPAREN, CHECK_OK);
|
| - ParseExpression(true, CHECK_OK);
|
| - Expect(Token::RPAREN, CHECK_OK);
|
| - Statement stat = ParseScopedStatement(labels, false, CHECK_OK);
|
| - if (peek() == Token::ELSE) {
|
| - Next();
|
| - Statement else_stat = ParseScopedStatement(labels, false, CHECK_OK);
|
| - stat = (stat.IsJumpStatement() && else_stat.IsJumpStatement()) ?
|
| - Statement::Jump() : Statement::Default();
|
| - } else {
|
| - stat = Statement::Default();
|
| - }
|
| - return stat;
|
| -}
|
| -
|
| -
|
| -PreParser::Statement PreParser::ParseContinueStatement(bool* ok) {
|
| - // ContinueStatement ::
|
| - // 'continue' [no line terminator] Identifier? ';'
|
| -
|
| - Expect(Token::CONTINUE, CHECK_OK);
|
| - Token::Value tok = peek();
|
| - if (!scanner()->HasAnyLineTerminatorBeforeNext() &&
|
| - tok != Token::SEMICOLON &&
|
| - tok != Token::RBRACE &&
|
| - tok != Token::EOS) {
|
| - // ECMA allows "eval" or "arguments" as labels even in strict mode.
|
| - ParseIdentifier(kAllowRestrictedIdentifiers, CHECK_OK);
|
| - }
|
| - ExpectSemicolon(CHECK_OK);
|
| - return Statement::Jump();
|
| -}
|
| -
|
| -PreParser::Statement PreParser::ParseBreakStatement(
|
| - ZoneList<const AstRawString*>* labels, bool* ok) {
|
| - // BreakStatement ::
|
| - // 'break' [no line terminator] Identifier? ';'
|
| -
|
| - Expect(Token::BREAK, CHECK_OK);
|
| - Token::Value tok = peek();
|
| - if (!scanner()->HasAnyLineTerminatorBeforeNext() &&
|
| - tok != Token::SEMICOLON &&
|
| - tok != Token::RBRACE &&
|
| - tok != Token::EOS) {
|
| - // ECMA allows "eval" or "arguments" as labels even in strict mode.
|
| - ParseIdentifier(kAllowRestrictedIdentifiers, CHECK_OK);
|
| - }
|
| - ExpectSemicolon(CHECK_OK);
|
| - return Statement::Jump();
|
| -}
|
| -
|
| -
|
| -PreParser::Statement PreParser::ParseReturnStatement(bool* ok) {
|
| - // ReturnStatement ::
|
| - // 'return' [no line terminator] Expression? ';'
|
| -
|
| - // Consume the return token. It is necessary to do before
|
| - // reporting any errors on it, because of the way errors are
|
| - // reported (underlining).
|
| - Expect(Token::RETURN, CHECK_OK);
|
| -
|
| - // An ECMAScript program is considered syntactically incorrect if it
|
| - // contains a return statement that is not within the body of a
|
| - // function. See ECMA-262, section 12.9, page 67.
|
| - // This is not handled during preparsing.
|
| -
|
| - Token::Value tok = peek();
|
| - if (!scanner()->HasAnyLineTerminatorBeforeNext() &&
|
| - tok != Token::SEMICOLON &&
|
| - tok != Token::RBRACE &&
|
| - tok != Token::EOS) {
|
| - // Because of the return code rewriting that happens in case of a subclass
|
| - // constructor we don't want to accept tail calls, therefore we don't set
|
| - // ReturnExprScope to kInsideValidReturnStatement here.
|
| - ReturnExprContext return_expr_context =
|
| - IsSubclassConstructor(function_state_->kind())
|
| - ? function_state_->return_expr_context()
|
| - : ReturnExprContext::kInsideValidReturnStatement;
|
| -
|
| - ReturnExprScope maybe_allow_tail_calls(function_state_,
|
| - return_expr_context);
|
| - ParseExpression(true, CHECK_OK);
|
| - }
|
| - ExpectSemicolon(CHECK_OK);
|
| - return Statement::Jump();
|
| -}
|
| -
|
| -PreParser::Statement PreParser::ParseWithStatement(
|
| - ZoneList<const AstRawString*>* labels, bool* ok) {
|
| - // WithStatement ::
|
| - // 'with' '(' Expression ')' Statement
|
| - Expect(Token::WITH, CHECK_OK);
|
| - if (is_strict(language_mode())) {
|
| - ReportMessageAt(scanner()->location(), MessageTemplate::kStrictWith);
|
| - *ok = false;
|
| - return Statement::Default();
|
| - }
|
| - Expect(Token::LPAREN, CHECK_OK);
|
| - ParseExpression(true, CHECK_OK);
|
| - Expect(Token::RPAREN, CHECK_OK);
|
| -
|
| - Scope* with_scope = NewScope(WITH_SCOPE);
|
| - BlockState block_state(&scope_state_, with_scope);
|
| - ParseScopedStatement(labels, true, CHECK_OK);
|
| - return Statement::Default();
|
| -}
|
| -
|
| PreParser::Statement PreParser::ParseSwitchStatement(
|
| ZoneList<const AstRawString*>* labels, bool* ok) {
|
| // SwitchStatement ::
|
|
|