Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1043)

Unified Diff: src/parsing/parser-base.h

Issue 2699793002: [parser cleanup] Simplify statement parsing logic (Closed)
Patch Set: Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/parsing/parser-base.h
diff --git a/src/parsing/parser-base.h b/src/parsing/parser-base.h
index c091dd8be8e6c87bd1e78fb5c67fdf4e3bc4f860..56a3bd98e3ceaba1929ec8c7943f9a023775ea60 100644
--- a/src/parsing/parser-base.h
+++ b/src/parsing/parser-base.h
@@ -1234,6 +1234,9 @@ class ParserBase {
LazyParsingResult ParseStatementList(StatementListT body, int end_token,
bool may_abort, bool* ok);
StatementT ParseStatementListItem(bool* ok);
+ StatementT ParseStatement(ZoneList<const AstRawString*>* labels, bool* ok) {
+ return ParseStatement(labels, kDisallowLabelledFunctionStatement, ok);
+ }
StatementT ParseStatement(ZoneList<const AstRawString*>* labels,
AllowLabelledFunctionStatement allow_function,
bool* ok);
@@ -1244,11 +1247,8 @@ class ParserBase {
// Parse a SubStatement in strict mode, or with an extra block scope in
// sloppy mode to handle
// ES#sec-functiondeclarations-in-ifstatement-statement-clauses
- // The legacy parameter indicates whether function declarations are
- // banned by the ES2015 specification in this location, and they are being
- // permitted here to match previous V8 behavior.
StatementT ParseScopedStatement(ZoneList<const AstRawString*>* labels,
- bool legacy, bool* ok);
+ bool* ok);
StatementT ParseVariableStatement(VariableDeclarationContext var_context,
ZoneList<const AstRawString*>* names,
@@ -4906,13 +4906,10 @@ typename ParserBase<Impl>::BlockT ParserBase<Impl>::ParseBlock(
template <typename Impl>
typename ParserBase<Impl>::StatementT ParserBase<Impl>::ParseScopedStatement(
- ZoneList<const AstRawString*>* labels, bool legacy, bool* ok) {
- if (is_strict(language_mode()) || peek() != Token::FUNCTION || legacy) {
- return ParseStatement(labels, kDisallowLabelledFunctionStatement, ok);
+ ZoneList<const AstRawString*>* labels, bool* ok) {
+ if (is_strict(language_mode()) || peek() != Token::FUNCTION) {
+ return ParseStatement(labels, ok);
} else {
- if (legacy) {
- impl()->CountUsage(v8::Isolate::kLegacyFunctionDeclaration);
- }
// Make a block around the statement for a lexical binding
// is introduced by a FunctionDeclaration.
BlockState block_state(zone(), &scope_state_);
@@ -5003,14 +5000,11 @@ ParserBase<Impl>::ParseExpressionOrLabelledStatement(
CHECK_OK);
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(labels, true, ok);
- }
+ if (peek() == Token::FUNCTION && is_sloppy(language_mode()) &&
+ allow_function == kAllowLabelledFunctionStatement) {
+ return ParseFunctionDeclaration(ok);
}
- return ParseStatement(labels, kDisallowLabelledFunctionStatement, ok);
+ return ParseStatement(labels, ok);
}
// If we have an extension, we allow a native function declaration.
@@ -5038,10 +5032,10 @@ typename ParserBase<Impl>::StatementT ParserBase<Impl>::ParseIfStatement(
Expect(Token::LPAREN, CHECK_OK);
ExpressionT condition = ParseExpression(true, CHECK_OK);
Expect(Token::RPAREN, CHECK_OK);
- StatementT then_statement = ParseScopedStatement(labels, false, CHECK_OK);
+ StatementT then_statement = ParseScopedStatement(labels, CHECK_OK);
StatementT else_statement = impl()->NullStatement();
if (Check(Token::ELSE)) {
- else_statement = ParseScopedStatement(labels, false, CHECK_OK);
+ else_statement = ParseScopedStatement(labels, CHECK_OK);
} else {
else_statement = factory()->NewEmptyStatement(kNoSourcePosition);
}
@@ -5196,7 +5190,7 @@ typename ParserBase<Impl>::StatementT ParserBase<Impl>::ParseWithStatement(
{
BlockState block_state(&scope_state_, with_scope);
with_scope->set_start_position(scanner()->peek_location().beg_pos);
- body = ParseScopedStatement(labels, true, CHECK_OK);
+ body = ParseStatement(labels, CHECK_OK);
with_scope->set_end_position(scanner()->location().end_pos);
}
return factory()->NewWithStatement(with_scope, expr, body, pos);
@@ -5212,7 +5206,7 @@ typename ParserBase<Impl>::StatementT ParserBase<Impl>::ParseDoWhileStatement(
typename Types::Target target(this, loop);
Expect(Token::DO, CHECK_OK);
- StatementT body = ParseScopedStatement(nullptr, true, CHECK_OK);
+ StatementT body = ParseStatement(nullptr, CHECK_OK);
Expect(Token::WHILE, CHECK_OK);
Expect(Token::LPAREN, CHECK_OK);
@@ -5242,7 +5236,7 @@ typename ParserBase<Impl>::StatementT ParserBase<Impl>::ParseWhileStatement(
Expect(Token::LPAREN, CHECK_OK);
ExpressionT cond = ParseExpression(true, CHECK_OK);
Expect(Token::RPAREN, CHECK_OK);
- StatementT body = ParseScopedStatement(nullptr, true, CHECK_OK);
+ StatementT body = ParseStatement(nullptr, CHECK_OK);
loop->Initialize(cond, body);
return loop;
@@ -5539,7 +5533,7 @@ ParserBase<Impl>::ParseForEachStatementWithDeclarations(
BlockState block_state(zone(), &scope_state_);
block_state.set_start_position(scanner()->location().beg_pos);
- StatementT body = ParseScopedStatement(nullptr, true, CHECK_OK);
+ StatementT body = ParseStatement(nullptr, CHECK_OK);
BlockT body_block = impl()->NullBlock();
ExpressionT each_variable = impl()->EmptyExpression();
@@ -5603,9 +5597,7 @@ ParserBase<Impl>::ParseForEachStatementWithoutDeclarations(
BlockState block_state(zone(), &scope_state_);
block_state.set_start_position(scanner()->location().beg_pos);
- // For legacy compat reasons, give for loops similar treatment to
- // if statements in allowing a function declaration for a body
- StatementT body = ParseScopedStatement(nullptr, true, CHECK_OK);
+ StatementT body = ParseStatement(nullptr, CHECK_OK);
block_state.set_end_position(scanner()->location().end_pos);
StatementT final_loop = impl()->InitializeForEachStatement(
loop, expression, enumerable, body, each_keyword_pos);
@@ -5656,7 +5648,7 @@ typename ParserBase<Impl>::StatementT ParserBase<Impl>::ParseStandardForLoop(
}
Expect(Token::RPAREN, CHECK_OK);
- body = ParseScopedStatement(nullptr, true, CHECK_OK);
+ body = ParseStatement(nullptr, CHECK_OK);
}
if (bound_names_are_lexical && for_info->bound_names.length() > 0) {
@@ -5805,9 +5797,7 @@ typename ParserBase<Impl>::StatementT ParserBase<Impl>::ParseForAwaitStatement(
BlockState block_state(zone(), &scope_state_);
block_state.set_start_position(scanner()->location().beg_pos);
- const bool kDisallowLabelledFunctionStatement = true;
- StatementT body = ParseScopedStatement(
- nullptr, kDisallowLabelledFunctionStatement, CHECK_OK);
+ StatementT body = ParseStatement(nullptr, CHECK_OK);
block_state.set_end_position(scanner()->location().end_pos);
if (has_declarations) {
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698