| OLD | NEW | 
|---|
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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 | 
| OLD | NEW | 
|---|