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

Unified Diff: src/parsing/parser.cc

Issue 2166843003: Allocate block scopes in block states when possible (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: rebase Created 4 years, 5 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 | src/parsing/parser-base.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/parsing/parser.cc
diff --git a/src/parsing/parser.cc b/src/parsing/parser.cc
index 406622147e08700dfcee98cf94985cd7b5607c76..4b6cdb1304662f72db58fdba3d17f373b4ad2b3e 100644
--- a/src/parsing/parser.cc
+++ b/src/parsing/parser.cc
@@ -2299,13 +2299,12 @@ Block* Parser::ParseBlock(ZoneList<const AstRawString*>* labels, bool* ok) {
// Construct block expecting 16 statements.
Block* body = factory()->NewBlock(labels, 16, false, kNoSourcePosition);
- Scope* block_scope = NewScope(BLOCK_SCOPE);
// Parse the statements and collect escaping labels.
Expect(Token::LBRACE, CHECK_OK);
- block_scope->set_start_position(scanner()->location().beg_pos);
{
- BlockState block_state(&scope_state_, block_scope);
+ BlockState block_state(&scope_state_);
+ block_state.set_start_position(scanner()->location().beg_pos);
Target target(&this->target_stack_, body);
while (peek() != Token::RBRACE) {
@@ -2314,11 +2313,11 @@ Block* Parser::ParseBlock(ZoneList<const AstRawString*>* labels, bool* ok) {
body->statements()->Add(stat, zone());
}
}
+
+ Expect(Token::RBRACE, CHECK_OK);
+ block_state.set_end_position(scanner()->location().end_pos);
+ body->set_scope(block_state.FinalizedBlockScope());
}
- Expect(Token::RBRACE, CHECK_OK);
- block_scope->set_end_position(scanner()->location().end_pos);
- block_scope = block_scope->FinalizeBlockScope();
- body->set_scope(block_scope);
return body;
}
@@ -2915,15 +2914,14 @@ Statement* Parser::ParseSwitchStatement(ZoneList<const AstRawString*>* labels,
zone());
Block* cases_block = factory()->NewBlock(NULL, 1, false, kNoSourcePosition);
- Scope* cases_scope = NewScope(BLOCK_SCOPE);
- cases_scope->SetNonlinear();
SwitchStatement* switch_statement =
factory()->NewSwitchStatement(labels, switch_pos);
- cases_scope->set_start_position(scanner()->location().beg_pos);
{
- BlockState cases_block_state(&scope_state_, cases_scope);
+ BlockState cases_block_state(&scope_state_);
+ cases_block_state.set_start_position(scanner()->location().beg_pos);
+ cases_block_state.SetNonlinear();
Target target(&this->target_stack_, switch_statement);
Expression* tag_read = factory()->NewVariableProxy(tag_variable);
@@ -2938,12 +2936,11 @@ Statement* Parser::ParseSwitchStatement(ZoneList<const AstRawString*>* labels,
}
switch_statement->Initialize(tag_read, cases);
cases_block->statements()->Add(switch_statement, zone());
- }
- Expect(Token::RBRACE, CHECK_OK);
+ Expect(Token::RBRACE, CHECK_OK);
- cases_scope->set_end_position(scanner()->location().end_pos);
- cases_scope = cases_scope->FinalizeBlockScope();
- cases_block->set_scope(cases_scope);
+ cases_block_state.set_end_position(scanner()->location().end_pos);
+ cases_block->set_scope(cases_block_state.FinalizedBlockScope());
+ }
switch_block->statements()->Add(cases_block, zone());
@@ -3028,10 +3025,9 @@ TryStatement* Parser::ParseTryStatement(bool* ok) {
// Create a block scope to hold any lexical declarations created
// as part of destructuring the catch parameter.
- Scope* block_scope = NewScope(BLOCK_SCOPE);
- block_scope->set_start_position(scanner()->location().beg_pos);
{
- BlockState block_state(&scope_state_, block_scope);
+ BlockState block_state(&scope_state_);
+ block_state.set_start_position(scanner()->location().beg_pos);
Target target(&this->target_stack_, catch_block);
const AstRawString* name = ast_value_factory()->dot_catch_string();
@@ -3097,10 +3093,9 @@ TryStatement* Parser::ParseTryStatement(bool* ok) {
return nullptr;
}
}
+ block_state.set_end_position(scanner()->location().end_pos);
+ catch_block->set_scope(block_state.FinalizedBlockScope());
}
- block_scope->set_end_position(scanner()->location().end_pos);
- block_scope = block_scope->FinalizeBlockScope();
- catch_block->set_scope(block_scope);
}
catch_scope->set_end_position(scanner()->location().end_pos);
@@ -3664,15 +3659,13 @@ Statement* Parser::ParseScopedStatement(ZoneList<const AstRawString*>* labels,
}
// Make a block around the statement for a lexical binding
// is introduced by a FunctionDeclaration.
- Scope* body_scope = NewScope(BLOCK_SCOPE);
- body_scope->set_start_position(scanner()->location().beg_pos);
- BlockState block_state(&scope_state_, body_scope);
+ BlockState block_state(&scope_state_);
+ block_state.set_start_position(scanner()->location().beg_pos);
Block* block = factory()->NewBlock(NULL, 1, false, kNoSourcePosition);
Statement* body = ParseFunctionDeclaration(CHECK_OK);
block->statements()->Add(body, zone());
- body_scope->set_end_position(scanner()->location().end_pos);
- body_scope = body_scope->FinalizeBlockScope();
- block->set_scope(body_scope);
+ block_state.set_end_position(scanner()->location().end_pos);
+ block->set_scope(block_state.FinalizedBlockScope());
return block;
}
}
@@ -3685,13 +3678,11 @@ Statement* Parser::ParseForStatement(ZoneList<const AstRawString*>* labels,
bool bound_names_are_lexical = false;
// Create an in-between scope for let-bound iteration variables.
- Scope* for_scope = NewScope(BLOCK_SCOPE);
-
- BlockState block_state(&scope_state_, for_scope);
+ BlockState for_state(&scope_state_);
Expect(Token::FOR, CHECK_OK);
Expect(Token::LPAREN, CHECK_OK);
- for_scope->set_start_position(scanner()->location().beg_pos);
- for_scope->set_is_hidden();
+ for_state.set_start_position(scanner()->location().beg_pos);
+ for_state.set_is_hidden();
DeclarationParsingResult parsing_result;
if (peek() != Token::SEMICOLON) {
if (peek() == Token::VAR || peek() == Token::CONST ||
@@ -3790,8 +3781,6 @@ Statement* Parser::ParseForStatement(ZoneList<const AstRawString*>* labels,
Expect(Token::RPAREN, CHECK_OK);
- Scope* body_scope = NewScope(BLOCK_SCOPE);
- body_scope->set_start_position(scanner()->location().beg_pos);
Block* body_block =
factory()->NewBlock(NULL, 3, false, kNoSourcePosition);
@@ -3800,7 +3789,8 @@ Statement* Parser::ParseForStatement(ZoneList<const AstRawString*>* labels,
{
ReturnExprScope no_tail_calls(function_state_,
ReturnExprContext::kInsideForInOfBody);
- BlockState block_state(&scope_state_, body_scope);
+ BlockState block_state(&scope_state_);
+ block_state.set_start_position(scanner()->location().beg_pos);
Statement* body = ParseScopedStatement(NULL, true, CHECK_OK);
@@ -3858,10 +3848,9 @@ Statement* Parser::ParseForStatement(ZoneList<const AstRawString*>* labels,
factory()->NewVariableProxy(temp, each_beg_pos, each_end_pos);
final_loop = InitializeForEachStatement(
loop, temp_proxy, enumerable, body_block, each_keyword_position);
+ block_state.set_end_position(scanner()->location().end_pos);
+ body_block->set_scope(block_state.FinalizedBlockScope());
}
- body_scope->set_end_position(scanner()->location().end_pos);
- body_scope = body_scope->FinalizeBlockScope();
- body_block->set_scope(body_scope);
// Create a TDZ for any lexically-bound names.
if (bound_names_are_lexical) {
@@ -3883,8 +3872,8 @@ Statement* Parser::ParseForStatement(ZoneList<const AstRawString*>* labels,
}
}
- for_scope->set_end_position(scanner()->location().end_pos);
- for_scope = for_scope->FinalizeBlockScope();
+ for_state.set_end_position(scanner()->location().end_pos);
+ Scope* for_scope = for_state.FinalizedBlockScope();
// Parsed for-in loop w/ variable declarations.
if (init_block != nullptr) {
init_block->statements()->Add(final_loop, zone());
@@ -3947,9 +3936,7 @@ Statement* Parser::ParseForStatement(ZoneList<const AstRawString*>* labels,
Statement* final_loop = InitializeForEachStatement(
loop, expression, enumerable, body, each_keyword_position);
- for_scope->set_end_position(scanner()->location().end_pos);
- for_scope = for_scope->FinalizeBlockScope();
- DCHECK(for_scope == nullptr);
+ DCHECK_NULL(for_state.FinalizedBlockScope());
return final_loop;
} else {
@@ -3972,8 +3959,9 @@ Statement* Parser::ParseForStatement(ZoneList<const AstRawString*>* labels,
// If there are let bindings, then condition and the next statement of the
// for loop must be parsed in a new scope.
Scope* inner_scope = scope();
+ // TODO(verwaest): Allocate this through a ScopeState as well.
if (bound_names_are_lexical && bound_names.length() > 0) {
- inner_scope = NewScopeWithParent(for_scope, BLOCK_SCOPE);
+ inner_scope = NewScopeWithParent(inner_scope, BLOCK_SCOPE);
inner_scope->set_start_position(scanner()->location().beg_pos);
}
{
@@ -3995,14 +3983,13 @@ Statement* Parser::ParseForStatement(ZoneList<const AstRawString*>* labels,
Statement* result = NULL;
if (bound_names_are_lexical && bound_names.length() > 0) {
- BlockState block_state(&scope_state_, for_scope);
result = DesugarLexicalBindingsInForStatement(
inner_scope, parsing_result.descriptor.mode, &bound_names, loop, init,
cond, next, body, CHECK_OK);
- for_scope->set_end_position(scanner()->location().end_pos);
+ for_state.set_end_position(scanner()->location().end_pos);
} else {
- for_scope->set_end_position(scanner()->location().end_pos);
- for_scope = for_scope->FinalizeBlockScope();
+ for_state.set_end_position(scanner()->location().end_pos);
+ Scope* for_scope = for_state.FinalizedBlockScope();
if (for_scope) {
// Rewrite a for statement of the form
// for (const x = i; c; n) b
@@ -5014,30 +5001,30 @@ Expression* Parser::ParseClassLiteral(ExpressionClassifier* classifier,
ReportMessageAt(class_name_location,
MessageTemplate::kUnexpectedStrictReserved);
*ok = false;
- return NULL;
+ return nullptr;
}
if (IsEvalOrArguments(name)) {
ReportMessageAt(class_name_location, MessageTemplate::kStrictEvalArguments);
*ok = false;
- return NULL;
+ return nullptr;
}
- Scope* block_scope = NewScope(BLOCK_SCOPE);
- BlockState block_state(&scope_state_, block_scope);
+ BlockState block_state(&scope_state_);
RaiseLanguageMode(STRICT);
scope()->SetScopeName(name);
- VariableProxy* proxy = NULL;
- if (name != NULL) {
+ VariableProxy* proxy = nullptr;
+ if (name != nullptr) {
proxy = NewUnresolved(name, CONST);
- Declaration* declaration =
- factory()->NewVariableDeclaration(proxy, CONST, block_scope, pos);
+ // TODO(verwaest): declare via block_state.
+ Declaration* declaration = factory()->NewVariableDeclaration(
+ proxy, CONST, block_state.scope(), pos);
Declare(declaration, DeclarationDescriptor::NORMAL, true, CHECK_OK);
}
- Expression* extends = NULL;
+ Expression* extends = nullptr;
if (Check(Token::EXTENDS)) {
- block_scope->set_start_position(scanner()->location().end_pos);
+ block_state.set_start_position(scanner()->location().end_pos);
ExpressionClassifier extends_classifier(this);
extends = ParseLeftHandSideExpression(&extends_classifier, CHECK_OK);
CheckNoTailCallExpressions(&extends_classifier, CHECK_OK);
@@ -5047,13 +5034,13 @@ Expression* Parser::ParseClassLiteral(ExpressionClassifier* classifier,
ExpressionClassifier::ExpressionProductions);
}
} else {
- block_scope->set_start_position(scanner()->location().end_pos);
+ block_state.set_start_position(scanner()->location().end_pos);
}
ClassLiteralChecker checker(this);
ZoneList<ObjectLiteral::Property*>* properties = NewPropertyList(4, zone());
- FunctionLiteral* constructor = NULL;
+ FunctionLiteral* constructor = nullptr;
bool has_seen_constructor = false;
Expect(Token::LBRACE, CHECK_OK);
@@ -5076,7 +5063,7 @@ Expression* Parser::ParseClassLiteral(ExpressionClassifier* classifier,
ExpressionClassifier::ExpressionProductions);
}
- if (has_seen_constructor && constructor == NULL) {
+ if (has_seen_constructor && constructor == nullptr) {
constructor = GetPropertyValue(property)->AsFunctionLiteral();
DCHECK_NOT_NULL(constructor);
constructor->set_raw_name(
@@ -5085,7 +5072,7 @@ Expression* Parser::ParseClassLiteral(ExpressionClassifier* classifier,
properties->Add(property, zone());
}
- if (fni_ != NULL) fni_->Infer();
+ if (fni_ != nullptr) fni_->Infer();
if (property_name != ast_value_factory()->constructor_string()) {
SetFunctionNameFromPropertyName(property, property_name);
@@ -5095,25 +5082,24 @@ Expression* Parser::ParseClassLiteral(ExpressionClassifier* classifier,
Expect(Token::RBRACE, CHECK_OK);
int end_pos = scanner()->location().end_pos;
- if (constructor == NULL) {
- DCHECK_EQ(scope(), block_scope);
+ if (constructor == nullptr) {
constructor = DefaultConstructor(name, has_extends, pos, end_pos,
- block_scope->language_mode());
+ block_state.language_mode());
}
// Note that we do not finalize this block scope because it is
// used as a sentinel value indicating an anonymous class.
- block_scope->set_end_position(end_pos);
+ block_state.set_end_position(end_pos);
- if (name != NULL) {
+ if (name != nullptr) {
DCHECK_NOT_NULL(proxy);
proxy->var()->set_initializer_position(end_pos);
}
Block* do_block = factory()->NewBlock(nullptr, 1, false, pos);
- do_block->set_scope(block_scope);
Variable* result_var =
- block_scope->NewTemporary(ast_value_factory()->empty_string());
+ scope()->NewTemporary(ast_value_factory()->empty_string());
+ do_block->set_scope(block_state.FinalizedBlockScope());
DoExpression* do_expr = factory()->NewDoExpression(do_block, result_var, pos);
ClassLiteral* class_literal = factory()->NewClassLiteral(
« no previous file with comments | « no previous file | src/parsing/parser-base.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698