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

Unified Diff: src/parser.cc

Issue 1471973003: Disallow destructuring in legacy sloppy for-in loop parsing (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Fix copyright on test Created 5 years, 1 month 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 | « src/parser.h ('k') | src/preparser.h » ('j') | src/preparser.cc » ('J')
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/parser.cc
diff --git a/src/parser.cc b/src/parser.cc
index 354f1c33187a33196be7b7db2813f089baa507b3..0a18cd99542679a54596659dec54855de7992a66 100644
--- a/src/parser.cc
+++ b/src/parser.cc
@@ -2381,16 +2381,6 @@ Block* Parser::ParseBlock(ZoneList<const AstRawString*>* labels, bool* ok) {
}
-const AstRawString* Parser::DeclarationParsingResult::SingleName() const {
- if (declarations.length() != 1) return nullptr;
- const Declaration& declaration = declarations.at(0);
- if (declaration.pattern->IsVariableProxy()) {
- return declaration.pattern->AsVariableProxy()->raw_name();
- }
- return nullptr;
-}
-
-
Block* Parser::DeclarationParsingResult::BuildInitializationBlock(
ZoneList<const AstRawString*>* names, bool* ok) {
Block* result = descriptor.parser->factory()->NewBlock(
@@ -3678,9 +3668,12 @@ Statement* Parser::ParseForStatement(ZoneList<const AstRawString*>* labels,
*ok = false;
return nullptr;
}
+ DeclarationParsingResult::Declaration& decl =
+ parsing_result.declarations[0];
if (parsing_result.first_initializer_loc.IsValid() &&
(is_strict(language_mode()) || mode == ForEachStatement::ITERATE ||
- IsLexicalVariableMode(parsing_result.descriptor.mode))) {
+ IsLexicalVariableMode(parsing_result.descriptor.mode) ||
+ !decl.pattern->IsVariableProxy())) {
if (mode == ForEachStatement::ITERATE) {
ReportMessageAt(parsing_result.first_initializer_loc,
MessageTemplate::kForOfLoopInitializer);
@@ -3693,23 +3686,22 @@ Statement* Parser::ParseForStatement(ZoneList<const AstRawString*>* labels,
return nullptr;
}
- DCHECK(parsing_result.declarations.length() == 1);
Block* init_block = nullptr;
// special case for legacy for (var/const x =.... in)
if (!IsLexicalVariableMode(parsing_result.descriptor.mode) &&
- parsing_result.declarations[0].initializer != nullptr) {
+ decl.pattern->IsVariableProxy() && decl.initializer != nullptr) {
+ const AstRawString* name =
+ decl.pattern->AsVariableProxy()->raw_name();
VariableProxy* single_var = scope_->NewUnresolved(
- factory(), parsing_result.SingleName(), Variable::NORMAL,
- each_beg_pos, each_end_pos);
+ factory(), name, Variable::NORMAL, each_beg_pos, each_end_pos);
init_block = factory()->NewBlock(
nullptr, 2, true, parsing_result.descriptor.declaration_pos);
init_block->statements()->Add(
factory()->NewExpressionStatement(
- factory()->NewAssignment(
- Token::ASSIGN, single_var,
- parsing_result.declarations[0].initializer,
- RelocInfo::kNoPosition),
+ factory()->NewAssignment(Token::ASSIGN, single_var,
+ decl.initializer,
+ RelocInfo::kNoPosition),
RelocInfo::kNoPosition),
zone());
}
@@ -3752,9 +3744,6 @@ Statement* Parser::ParseForStatement(ZoneList<const AstRawString*>* labels,
auto each_initialization_block =
factory()->NewBlock(nullptr, 1, true, RelocInfo::kNoPosition);
{
- DCHECK(parsing_result.declarations.length() == 1);
- DeclarationParsingResult::Declaration decl =
- parsing_result.declarations[0];
auto descriptor = parsing_result.descriptor;
descriptor.declaration_pos = RelocInfo::kNoPosition;
descriptor.initialization_pos = RelocInfo::kNoPosition;
« no previous file with comments | « src/parser.h ('k') | src/preparser.h » ('j') | src/preparser.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698