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

Side by Side 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 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 unified diff | Download patch
« no previous file with comments | « src/parser.h ('k') | src/preparser.h » ('j') | src/preparser.cc » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/parser.h" 5 #include "src/parser.h"
6 6
7 #include "src/api.h" 7 #include "src/api.h"
8 #include "src/ast.h" 8 #include "src/ast.h"
9 #include "src/ast-literal-reindexer.h" 9 #include "src/ast-literal-reindexer.h"
10 #include "src/bailout-reason.h" 10 #include "src/bailout-reason.h"
(...skipping 2363 matching lines...) Expand 10 before | Expand all | Expand 10 after
2374 } 2374 }
2375 } 2375 }
2376 Expect(Token::RBRACE, CHECK_OK); 2376 Expect(Token::RBRACE, CHECK_OK);
2377 block_scope->set_end_position(scanner()->location().end_pos); 2377 block_scope->set_end_position(scanner()->location().end_pos);
2378 block_scope = block_scope->FinalizeBlockScope(); 2378 block_scope = block_scope->FinalizeBlockScope();
2379 body->set_scope(block_scope); 2379 body->set_scope(block_scope);
2380 return body; 2380 return body;
2381 } 2381 }
2382 2382
2383 2383
2384 const AstRawString* Parser::DeclarationParsingResult::SingleName() const {
2385 if (declarations.length() != 1) return nullptr;
2386 const Declaration& declaration = declarations.at(0);
2387 if (declaration.pattern->IsVariableProxy()) {
2388 return declaration.pattern->AsVariableProxy()->raw_name();
2389 }
2390 return nullptr;
2391 }
2392
2393
2394 Block* Parser::DeclarationParsingResult::BuildInitializationBlock( 2384 Block* Parser::DeclarationParsingResult::BuildInitializationBlock(
2395 ZoneList<const AstRawString*>* names, bool* ok) { 2385 ZoneList<const AstRawString*>* names, bool* ok) {
2396 Block* result = descriptor.parser->factory()->NewBlock( 2386 Block* result = descriptor.parser->factory()->NewBlock(
2397 NULL, 1, true, descriptor.declaration_pos); 2387 NULL, 1, true, descriptor.declaration_pos);
2398 for (auto declaration : declarations) { 2388 for (auto declaration : declarations) {
2399 PatternRewriter::DeclareAndInitializeVariables( 2389 PatternRewriter::DeclareAndInitializeVariables(
2400 result, &descriptor, &declaration, names, CHECK_OK); 2390 result, &descriptor, &declaration, names, CHECK_OK);
2401 } 2391 }
2402 return result; 2392 return result;
2403 } 2393 }
(...skipping 1267 matching lines...) Expand 10 before | Expand all | Expand 10 after
3671 if (!*ok) return nullptr; 3661 if (!*ok) return nullptr;
3672 if (num_decl != 1) { 3662 if (num_decl != 1) {
3673 const char* loop_type = 3663 const char* loop_type =
3674 mode == ForEachStatement::ITERATE ? "for-of" : "for-in"; 3664 mode == ForEachStatement::ITERATE ? "for-of" : "for-in";
3675 ParserTraits::ReportMessageAt( 3665 ParserTraits::ReportMessageAt(
3676 parsing_result.bindings_loc, 3666 parsing_result.bindings_loc,
3677 MessageTemplate::kForInOfLoopMultiBindings, loop_type); 3667 MessageTemplate::kForInOfLoopMultiBindings, loop_type);
3678 *ok = false; 3668 *ok = false;
3679 return nullptr; 3669 return nullptr;
3680 } 3670 }
3671 DeclarationParsingResult::Declaration& decl =
3672 parsing_result.declarations[0];
3681 if (parsing_result.first_initializer_loc.IsValid() && 3673 if (parsing_result.first_initializer_loc.IsValid() &&
3682 (is_strict(language_mode()) || mode == ForEachStatement::ITERATE || 3674 (is_strict(language_mode()) || mode == ForEachStatement::ITERATE ||
3683 IsLexicalVariableMode(parsing_result.descriptor.mode))) { 3675 IsLexicalVariableMode(parsing_result.descriptor.mode) ||
3676 !decl.pattern->IsVariableProxy())) {
3684 if (mode == ForEachStatement::ITERATE) { 3677 if (mode == ForEachStatement::ITERATE) {
3685 ReportMessageAt(parsing_result.first_initializer_loc, 3678 ReportMessageAt(parsing_result.first_initializer_loc,
3686 MessageTemplate::kForOfLoopInitializer); 3679 MessageTemplate::kForOfLoopInitializer);
3687 } else { 3680 } else {
3688 // TODO(caitp): This should be an error in sloppy mode too. 3681 // TODO(caitp): This should be an error in sloppy mode too.
3689 ReportMessageAt(parsing_result.first_initializer_loc, 3682 ReportMessageAt(parsing_result.first_initializer_loc,
3690 MessageTemplate::kForInLoopInitializer); 3683 MessageTemplate::kForInLoopInitializer);
3691 } 3684 }
3692 *ok = false; 3685 *ok = false;
3693 return nullptr; 3686 return nullptr;
3694 } 3687 }
3695 3688
3696 DCHECK(parsing_result.declarations.length() == 1);
3697 Block* init_block = nullptr; 3689 Block* init_block = nullptr;
3698 3690
3699 // special case for legacy for (var/const x =.... in) 3691 // special case for legacy for (var/const x =.... in)
3700 if (!IsLexicalVariableMode(parsing_result.descriptor.mode) && 3692 if (!IsLexicalVariableMode(parsing_result.descriptor.mode) &&
3701 parsing_result.declarations[0].initializer != nullptr) { 3693 decl.pattern->IsVariableProxy() && decl.initializer != nullptr) {
3694 const AstRawString* name =
3695 decl.pattern->AsVariableProxy()->raw_name();
3702 VariableProxy* single_var = scope_->NewUnresolved( 3696 VariableProxy* single_var = scope_->NewUnresolved(
3703 factory(), parsing_result.SingleName(), Variable::NORMAL, 3697 factory(), name, Variable::NORMAL, each_beg_pos, each_end_pos);
3704 each_beg_pos, each_end_pos);
3705 init_block = factory()->NewBlock( 3698 init_block = factory()->NewBlock(
3706 nullptr, 2, true, parsing_result.descriptor.declaration_pos); 3699 nullptr, 2, true, parsing_result.descriptor.declaration_pos);
3707 init_block->statements()->Add( 3700 init_block->statements()->Add(
3708 factory()->NewExpressionStatement( 3701 factory()->NewExpressionStatement(
3709 factory()->NewAssignment( 3702 factory()->NewAssignment(Token::ASSIGN, single_var,
3710 Token::ASSIGN, single_var, 3703 decl.initializer,
3711 parsing_result.declarations[0].initializer, 3704 RelocInfo::kNoPosition),
3712 RelocInfo::kNoPosition),
3713 RelocInfo::kNoPosition), 3705 RelocInfo::kNoPosition),
3714 zone()); 3706 zone());
3715 } 3707 }
3716 3708
3717 // Rewrite a for-in/of statement of the form 3709 // Rewrite a for-in/of statement of the form
3718 // 3710 //
3719 // for (let/const/var x in/of e) b 3711 // for (let/const/var x in/of e) b
3720 // 3712 //
3721 // into 3713 // into
3722 // 3714 //
(...skipping 22 matching lines...) Expand all
3745 scope_ = body_scope; 3737 scope_ = body_scope;
3746 3738
3747 Statement* body = ParseSubStatement(NULL, CHECK_OK); 3739 Statement* body = ParseSubStatement(NULL, CHECK_OK);
3748 3740
3749 Block* body_block = 3741 Block* body_block =
3750 factory()->NewBlock(NULL, 3, false, RelocInfo::kNoPosition); 3742 factory()->NewBlock(NULL, 3, false, RelocInfo::kNoPosition);
3751 3743
3752 auto each_initialization_block = 3744 auto each_initialization_block =
3753 factory()->NewBlock(nullptr, 1, true, RelocInfo::kNoPosition); 3745 factory()->NewBlock(nullptr, 1, true, RelocInfo::kNoPosition);
3754 { 3746 {
3755 DCHECK(parsing_result.declarations.length() == 1);
3756 DeclarationParsingResult::Declaration decl =
3757 parsing_result.declarations[0];
3758 auto descriptor = parsing_result.descriptor; 3747 auto descriptor = parsing_result.descriptor;
3759 descriptor.declaration_pos = RelocInfo::kNoPosition; 3748 descriptor.declaration_pos = RelocInfo::kNoPosition;
3760 descriptor.initialization_pos = RelocInfo::kNoPosition; 3749 descriptor.initialization_pos = RelocInfo::kNoPosition;
3761 decl.initializer = factory()->NewVariableProxy(temp); 3750 decl.initializer = factory()->NewVariableProxy(temp);
3762 3751
3763 PatternRewriter::DeclareAndInitializeVariables( 3752 PatternRewriter::DeclareAndInitializeVariables(
3764 each_initialization_block, &descriptor, &decl, 3753 each_initialization_block, &descriptor, &decl,
3765 IsLexicalVariableMode(descriptor.mode) ? &lexical_bindings 3754 IsLexicalVariableMode(descriptor.mode) ? &lexical_bindings
3766 : nullptr, 3755 : nullptr,
3767 CHECK_OK); 3756 CHECK_OK);
(...skipping 2688 matching lines...) Expand 10 before | Expand all | Expand 10 after
6456 } 6445 }
6457 6446
6458 6447
6459 void Parser::RaiseLanguageMode(LanguageMode mode) { 6448 void Parser::RaiseLanguageMode(LanguageMode mode) {
6460 SetLanguageMode(scope_, 6449 SetLanguageMode(scope_,
6461 static_cast<LanguageMode>(scope_->language_mode() | mode)); 6450 static_cast<LanguageMode>(scope_->language_mode() | mode));
6462 } 6451 }
6463 6452
6464 } // namespace internal 6453 } // namespace internal
6465 } // namespace v8 6454 } // namespace v8
OLDNEW
« 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