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

Side by Side 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, 4 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 unified diff | Download patch
« no previous file with comments | « no previous file | src/parsing/parser-base.h » ('j') | no next file with comments »
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/parsing/parser.h" 5 #include "src/parsing/parser.h"
6 6
7 #include <memory> 7 #include <memory>
8 8
9 #include "src/api.h" 9 #include "src/api.h"
10 #include "src/ast/ast.h" 10 #include "src/ast/ast.h"
(...skipping 2281 matching lines...) Expand 10 before | Expand all | Expand 10 after
2292 } 2292 }
2293 2293
2294 Block* Parser::ParseBlock(ZoneList<const AstRawString*>* labels, bool* ok) { 2294 Block* Parser::ParseBlock(ZoneList<const AstRawString*>* labels, bool* ok) {
2295 // The harmony mode uses block elements instead of statements. 2295 // The harmony mode uses block elements instead of statements.
2296 // 2296 //
2297 // Block :: 2297 // Block ::
2298 // '{' StatementList '}' 2298 // '{' StatementList '}'
2299 2299
2300 // Construct block expecting 16 statements. 2300 // Construct block expecting 16 statements.
2301 Block* body = factory()->NewBlock(labels, 16, false, kNoSourcePosition); 2301 Block* body = factory()->NewBlock(labels, 16, false, kNoSourcePosition);
2302 Scope* block_scope = NewScope(BLOCK_SCOPE);
2303 2302
2304 // Parse the statements and collect escaping labels. 2303 // Parse the statements and collect escaping labels.
2305 Expect(Token::LBRACE, CHECK_OK); 2304 Expect(Token::LBRACE, CHECK_OK);
2306 block_scope->set_start_position(scanner()->location().beg_pos);
2307 { 2305 {
2308 BlockState block_state(&scope_state_, block_scope); 2306 BlockState block_state(&scope_state_);
2307 block_state.set_start_position(scanner()->location().beg_pos);
2309 Target target(&this->target_stack_, body); 2308 Target target(&this->target_stack_, body);
2310 2309
2311 while (peek() != Token::RBRACE) { 2310 while (peek() != Token::RBRACE) {
2312 Statement* stat = ParseStatementListItem(CHECK_OK); 2311 Statement* stat = ParseStatementListItem(CHECK_OK);
2313 if (stat && !stat->IsEmpty()) { 2312 if (stat && !stat->IsEmpty()) {
2314 body->statements()->Add(stat, zone()); 2313 body->statements()->Add(stat, zone());
2315 } 2314 }
2316 } 2315 }
2316
2317 Expect(Token::RBRACE, CHECK_OK);
2318 block_state.set_end_position(scanner()->location().end_pos);
2319 body->set_scope(block_state.FinalizedBlockScope());
2317 } 2320 }
2318 Expect(Token::RBRACE, CHECK_OK);
2319 block_scope->set_end_position(scanner()->location().end_pos);
2320 block_scope = block_scope->FinalizeBlockScope();
2321 body->set_scope(block_scope);
2322 return body; 2321 return body;
2323 } 2322 }
2324 2323
2325 2324
2326 Block* Parser::DeclarationParsingResult::BuildInitializationBlock( 2325 Block* Parser::DeclarationParsingResult::BuildInitializationBlock(
2327 ZoneList<const AstRawString*>* names, bool* ok) { 2326 ZoneList<const AstRawString*>* names, bool* ok) {
2328 Block* result = descriptor.parser->factory()->NewBlock( 2327 Block* result = descriptor.parser->factory()->NewBlock(
2329 NULL, 1, true, descriptor.declaration_pos); 2328 NULL, 1, true, descriptor.declaration_pos);
2330 for (auto declaration : declarations) { 2329 for (auto declaration : declarations) {
2331 PatternRewriter::DeclareAndInitializeVariables( 2330 PatternRewriter::DeclareAndInitializeVariables(
(...skipping 576 matching lines...) Expand 10 before | Expand all | Expand 10 after
2908 2907
2909 // make statement: undefined; 2908 // make statement: undefined;
2910 // This is needed so the tag isn't returned as the value, in case the switch 2909 // This is needed so the tag isn't returned as the value, in case the switch
2911 // statements don't have a value. 2910 // statements don't have a value.
2912 switch_block->statements()->Add( 2911 switch_block->statements()->Add(
2913 factory()->NewExpressionStatement( 2912 factory()->NewExpressionStatement(
2914 factory()->NewUndefinedLiteral(kNoSourcePosition), kNoSourcePosition), 2913 factory()->NewUndefinedLiteral(kNoSourcePosition), kNoSourcePosition),
2915 zone()); 2914 zone());
2916 2915
2917 Block* cases_block = factory()->NewBlock(NULL, 1, false, kNoSourcePosition); 2916 Block* cases_block = factory()->NewBlock(NULL, 1, false, kNoSourcePosition);
2918 Scope* cases_scope = NewScope(BLOCK_SCOPE);
2919 cases_scope->SetNonlinear();
2920 2917
2921 SwitchStatement* switch_statement = 2918 SwitchStatement* switch_statement =
2922 factory()->NewSwitchStatement(labels, switch_pos); 2919 factory()->NewSwitchStatement(labels, switch_pos);
2923 2920
2924 cases_scope->set_start_position(scanner()->location().beg_pos);
2925 { 2921 {
2926 BlockState cases_block_state(&scope_state_, cases_scope); 2922 BlockState cases_block_state(&scope_state_);
2923 cases_block_state.set_start_position(scanner()->location().beg_pos);
2924 cases_block_state.SetNonlinear();
2927 Target target(&this->target_stack_, switch_statement); 2925 Target target(&this->target_stack_, switch_statement);
2928 2926
2929 Expression* tag_read = factory()->NewVariableProxy(tag_variable); 2927 Expression* tag_read = factory()->NewVariableProxy(tag_variable);
2930 2928
2931 bool default_seen = false; 2929 bool default_seen = false;
2932 ZoneList<CaseClause*>* cases = 2930 ZoneList<CaseClause*>* cases =
2933 new (zone()) ZoneList<CaseClause*>(4, zone()); 2931 new (zone()) ZoneList<CaseClause*>(4, zone());
2934 Expect(Token::LBRACE, CHECK_OK); 2932 Expect(Token::LBRACE, CHECK_OK);
2935 while (peek() != Token::RBRACE) { 2933 while (peek() != Token::RBRACE) {
2936 CaseClause* clause = ParseCaseClause(&default_seen, CHECK_OK); 2934 CaseClause* clause = ParseCaseClause(&default_seen, CHECK_OK);
2937 cases->Add(clause, zone()); 2935 cases->Add(clause, zone());
2938 } 2936 }
2939 switch_statement->Initialize(tag_read, cases); 2937 switch_statement->Initialize(tag_read, cases);
2940 cases_block->statements()->Add(switch_statement, zone()); 2938 cases_block->statements()->Add(switch_statement, zone());
2939 Expect(Token::RBRACE, CHECK_OK);
2940
2941 cases_block_state.set_end_position(scanner()->location().end_pos);
2942 cases_block->set_scope(cases_block_state.FinalizedBlockScope());
2941 } 2943 }
2942 Expect(Token::RBRACE, CHECK_OK);
2943
2944 cases_scope->set_end_position(scanner()->location().end_pos);
2945 cases_scope = cases_scope->FinalizeBlockScope();
2946 cases_block->set_scope(cases_scope);
2947 2944
2948 switch_block->statements()->Add(cases_block, zone()); 2945 switch_block->statements()->Add(cases_block, zone());
2949 2946
2950 return switch_block; 2947 return switch_block;
2951 } 2948 }
2952 2949
2953 2950
2954 Statement* Parser::ParseThrowStatement(bool* ok) { 2951 Statement* Parser::ParseThrowStatement(bool* ok) {
2955 // ThrowStatement :: 2952 // ThrowStatement ::
2956 // 'throw' Expression ';' 2953 // 'throw' Expression ';'
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
3021 { 3018 {
3022 CollectExpressionsInTailPositionToListScope 3019 CollectExpressionsInTailPositionToListScope
3023 collect_tail_call_expressions_scope( 3020 collect_tail_call_expressions_scope(
3024 function_state_, &tail_call_expressions_in_catch_block); 3021 function_state_, &tail_call_expressions_in_catch_block);
3025 BlockState block_state(&scope_state_, catch_scope); 3022 BlockState block_state(&scope_state_, catch_scope);
3026 3023
3027 catch_block = factory()->NewBlock(nullptr, 16, false, kNoSourcePosition); 3024 catch_block = factory()->NewBlock(nullptr, 16, false, kNoSourcePosition);
3028 3025
3029 // Create a block scope to hold any lexical declarations created 3026 // Create a block scope to hold any lexical declarations created
3030 // as part of destructuring the catch parameter. 3027 // as part of destructuring the catch parameter.
3031 Scope* block_scope = NewScope(BLOCK_SCOPE);
3032 block_scope->set_start_position(scanner()->location().beg_pos);
3033 { 3028 {
3034 BlockState block_state(&scope_state_, block_scope); 3029 BlockState block_state(&scope_state_);
3030 block_state.set_start_position(scanner()->location().beg_pos);
3035 Target target(&this->target_stack_, catch_block); 3031 Target target(&this->target_stack_, catch_block);
3036 3032
3037 const AstRawString* name = ast_value_factory()->dot_catch_string(); 3033 const AstRawString* name = ast_value_factory()->dot_catch_string();
3038 Expression* pattern = nullptr; 3034 Expression* pattern = nullptr;
3039 if (peek_any_identifier()) { 3035 if (peek_any_identifier()) {
3040 name = ParseIdentifier(kDontAllowRestrictedIdentifiers, CHECK_OK); 3036 name = ParseIdentifier(kDontAllowRestrictedIdentifiers, CHECK_OK);
3041 } else { 3037 } else {
3042 ExpressionClassifier pattern_classifier(this); 3038 ExpressionClassifier pattern_classifier(this);
3043 pattern = ParsePrimaryExpression(&pattern_classifier, CHECK_OK); 3039 pattern = ParsePrimaryExpression(&pattern_classifier, CHECK_OK);
3044 ValidateBindingPattern(&pattern_classifier, CHECK_OK); 3040 ValidateBindingPattern(&pattern_classifier, CHECK_OK);
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
3090 Scanner::Location location = 3086 Scanner::Location location =
3091 position == kNoSourcePosition 3087 position == kNoSourcePosition
3092 ? Scanner::Location::invalid() 3088 ? Scanner::Location::invalid()
3093 : Scanner::Location(position, position + 1); 3089 : Scanner::Location(position, position + 1);
3094 ParserTraits::ReportMessageAt( 3090 ParserTraits::ReportMessageAt(
3095 location, MessageTemplate::kVarRedeclaration, name); 3091 location, MessageTemplate::kVarRedeclaration, name);
3096 *ok = false; 3092 *ok = false;
3097 return nullptr; 3093 return nullptr;
3098 } 3094 }
3099 } 3095 }
3096 block_state.set_end_position(scanner()->location().end_pos);
3097 catch_block->set_scope(block_state.FinalizedBlockScope());
3100 } 3098 }
3101 block_scope->set_end_position(scanner()->location().end_pos);
3102 block_scope = block_scope->FinalizeBlockScope();
3103 catch_block->set_scope(block_scope);
3104 } 3099 }
3105 3100
3106 catch_scope->set_end_position(scanner()->location().end_pos); 3101 catch_scope->set_end_position(scanner()->location().end_pos);
3107 tok = peek(); 3102 tok = peek();
3108 } 3103 }
3109 3104
3110 Block* finally_block = NULL; 3105 Block* finally_block = NULL;
3111 DCHECK(tok == Token::FINALLY || catch_block != NULL); 3106 DCHECK(tok == Token::FINALLY || catch_block != NULL);
3112 if (tok == Token::FINALLY) { 3107 if (tok == Token::FINALLY) {
3113 Consume(Token::FINALLY); 3108 Consume(Token::FINALLY);
(...skipping 543 matching lines...) Expand 10 before | Expand all | Expand 10 after
3657 bool legacy, bool* ok) { 3652 bool legacy, bool* ok) {
3658 if (is_strict(language_mode()) || peek() != Token::FUNCTION || 3653 if (is_strict(language_mode()) || peek() != Token::FUNCTION ||
3659 (legacy && allow_harmony_restrictive_declarations())) { 3654 (legacy && allow_harmony_restrictive_declarations())) {
3660 return ParseSubStatement(labels, kDisallowLabelledFunctionStatement, ok); 3655 return ParseSubStatement(labels, kDisallowLabelledFunctionStatement, ok);
3661 } else { 3656 } else {
3662 if (legacy) { 3657 if (legacy) {
3663 ++use_counts_[v8::Isolate::kLegacyFunctionDeclaration]; 3658 ++use_counts_[v8::Isolate::kLegacyFunctionDeclaration];
3664 } 3659 }
3665 // Make a block around the statement for a lexical binding 3660 // Make a block around the statement for a lexical binding
3666 // is introduced by a FunctionDeclaration. 3661 // is introduced by a FunctionDeclaration.
3667 Scope* body_scope = NewScope(BLOCK_SCOPE); 3662 BlockState block_state(&scope_state_);
3668 body_scope->set_start_position(scanner()->location().beg_pos); 3663 block_state.set_start_position(scanner()->location().beg_pos);
3669 BlockState block_state(&scope_state_, body_scope);
3670 Block* block = factory()->NewBlock(NULL, 1, false, kNoSourcePosition); 3664 Block* block = factory()->NewBlock(NULL, 1, false, kNoSourcePosition);
3671 Statement* body = ParseFunctionDeclaration(CHECK_OK); 3665 Statement* body = ParseFunctionDeclaration(CHECK_OK);
3672 block->statements()->Add(body, zone()); 3666 block->statements()->Add(body, zone());
3673 body_scope->set_end_position(scanner()->location().end_pos); 3667 block_state.set_end_position(scanner()->location().end_pos);
3674 body_scope = body_scope->FinalizeBlockScope(); 3668 block->set_scope(block_state.FinalizedBlockScope());
3675 block->set_scope(body_scope);
3676 return block; 3669 return block;
3677 } 3670 }
3678 } 3671 }
3679 3672
3680 Statement* Parser::ParseForStatement(ZoneList<const AstRawString*>* labels, 3673 Statement* Parser::ParseForStatement(ZoneList<const AstRawString*>* labels,
3681 bool* ok) { 3674 bool* ok) {
3682 int stmt_pos = peek_position(); 3675 int stmt_pos = peek_position();
3683 Statement* init = NULL; 3676 Statement* init = NULL;
3684 ZoneList<const AstRawString*> bound_names(1, zone()); 3677 ZoneList<const AstRawString*> bound_names(1, zone());
3685 bool bound_names_are_lexical = false; 3678 bool bound_names_are_lexical = false;
3686 3679
3687 // Create an in-between scope for let-bound iteration variables. 3680 // Create an in-between scope for let-bound iteration variables.
3688 Scope* for_scope = NewScope(BLOCK_SCOPE); 3681 BlockState for_state(&scope_state_);
3689
3690 BlockState block_state(&scope_state_, for_scope);
3691 Expect(Token::FOR, CHECK_OK); 3682 Expect(Token::FOR, CHECK_OK);
3692 Expect(Token::LPAREN, CHECK_OK); 3683 Expect(Token::LPAREN, CHECK_OK);
3693 for_scope->set_start_position(scanner()->location().beg_pos); 3684 for_state.set_start_position(scanner()->location().beg_pos);
3694 for_scope->set_is_hidden(); 3685 for_state.set_is_hidden();
3695 DeclarationParsingResult parsing_result; 3686 DeclarationParsingResult parsing_result;
3696 if (peek() != Token::SEMICOLON) { 3687 if (peek() != Token::SEMICOLON) {
3697 if (peek() == Token::VAR || peek() == Token::CONST || 3688 if (peek() == Token::VAR || peek() == Token::CONST ||
3698 (peek() == Token::LET && IsNextLetKeyword())) { 3689 (peek() == Token::LET && IsNextLetKeyword())) {
3699 ParseVariableDeclarations(kForStatement, &parsing_result, nullptr, 3690 ParseVariableDeclarations(kForStatement, &parsing_result, nullptr,
3700 CHECK_OK); 3691 CHECK_OK);
3701 3692
3702 ForEachStatement::VisitMode mode = ForEachStatement::ENUMERATE; 3693 ForEachStatement::VisitMode mode = ForEachStatement::ENUMERATE;
3703 int each_beg_pos = scanner()->location().beg_pos; 3694 int each_beg_pos = scanner()->location().beg_pos;
3704 int each_end_pos = scanner()->location().end_pos; 3695 int each_end_pos = scanner()->location().end_pos;
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
3783 if (mode == ForEachStatement::ITERATE) { 3774 if (mode == ForEachStatement::ITERATE) {
3784 ExpressionClassifier classifier(this); 3775 ExpressionClassifier classifier(this);
3785 enumerable = ParseAssignmentExpression(true, &classifier, CHECK_OK); 3776 enumerable = ParseAssignmentExpression(true, &classifier, CHECK_OK);
3786 RewriteNonPattern(&classifier, CHECK_OK); 3777 RewriteNonPattern(&classifier, CHECK_OK);
3787 } else { 3778 } else {
3788 enumerable = ParseExpression(true, CHECK_OK); 3779 enumerable = ParseExpression(true, CHECK_OK);
3789 } 3780 }
3790 3781
3791 Expect(Token::RPAREN, CHECK_OK); 3782 Expect(Token::RPAREN, CHECK_OK);
3792 3783
3793 Scope* body_scope = NewScope(BLOCK_SCOPE);
3794 body_scope->set_start_position(scanner()->location().beg_pos);
3795 3784
3796 Block* body_block = 3785 Block* body_block =
3797 factory()->NewBlock(NULL, 3, false, kNoSourcePosition); 3786 factory()->NewBlock(NULL, 3, false, kNoSourcePosition);
3798 3787
3799 Statement* final_loop; 3788 Statement* final_loop;
3800 { 3789 {
3801 ReturnExprScope no_tail_calls(function_state_, 3790 ReturnExprScope no_tail_calls(function_state_,
3802 ReturnExprContext::kInsideForInOfBody); 3791 ReturnExprContext::kInsideForInOfBody);
3803 BlockState block_state(&scope_state_, body_scope); 3792 BlockState block_state(&scope_state_);
3793 block_state.set_start_position(scanner()->location().beg_pos);
3804 3794
3805 Statement* body = ParseScopedStatement(NULL, true, CHECK_OK); 3795 Statement* body = ParseScopedStatement(NULL, true, CHECK_OK);
3806 3796
3807 auto each_initialization_block = 3797 auto each_initialization_block =
3808 factory()->NewBlock(nullptr, 1, true, kNoSourcePosition); 3798 factory()->NewBlock(nullptr, 1, true, kNoSourcePosition);
3809 { 3799 {
3810 auto descriptor = parsing_result.descriptor; 3800 auto descriptor = parsing_result.descriptor;
3811 descriptor.declaration_pos = kNoSourcePosition; 3801 descriptor.declaration_pos = kNoSourcePosition;
3812 descriptor.initialization_pos = kNoSourcePosition; 3802 descriptor.initialization_pos = kNoSourcePosition;
3813 decl.initializer = factory()->NewVariableProxy(temp); 3803 decl.initializer = factory()->NewVariableProxy(temp);
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
3851 } 3841 }
3852 } 3842 }
3853 } 3843 }
3854 3844
3855 body_block->statements()->Add(each_initialization_block, zone()); 3845 body_block->statements()->Add(each_initialization_block, zone());
3856 body_block->statements()->Add(body, zone()); 3846 body_block->statements()->Add(body, zone());
3857 VariableProxy* temp_proxy = 3847 VariableProxy* temp_proxy =
3858 factory()->NewVariableProxy(temp, each_beg_pos, each_end_pos); 3848 factory()->NewVariableProxy(temp, each_beg_pos, each_end_pos);
3859 final_loop = InitializeForEachStatement( 3849 final_loop = InitializeForEachStatement(
3860 loop, temp_proxy, enumerable, body_block, each_keyword_position); 3850 loop, temp_proxy, enumerable, body_block, each_keyword_position);
3851 block_state.set_end_position(scanner()->location().end_pos);
3852 body_block->set_scope(block_state.FinalizedBlockScope());
3861 } 3853 }
3862 body_scope->set_end_position(scanner()->location().end_pos);
3863 body_scope = body_scope->FinalizeBlockScope();
3864 body_block->set_scope(body_scope);
3865 3854
3866 // Create a TDZ for any lexically-bound names. 3855 // Create a TDZ for any lexically-bound names.
3867 if (bound_names_are_lexical) { 3856 if (bound_names_are_lexical) {
3868 DCHECK_NULL(init_block); 3857 DCHECK_NULL(init_block);
3869 3858
3870 init_block = 3859 init_block =
3871 factory()->NewBlock(nullptr, 1, false, kNoSourcePosition); 3860 factory()->NewBlock(nullptr, 1, false, kNoSourcePosition);
3872 3861
3873 for (int i = 0; i < bound_names.length(); ++i) { 3862 for (int i = 0; i < bound_names.length(); ++i) {
3874 // TODO(adamk): This needs to be some sort of special 3863 // TODO(adamk): This needs to be some sort of special
3875 // INTERNAL variable that's invisible to the debugger 3864 // INTERNAL variable that's invisible to the debugger
3876 // but visible to everything else. 3865 // but visible to everything else.
3877 VariableProxy* tdz_proxy = NewUnresolved(bound_names[i], LET); 3866 VariableProxy* tdz_proxy = NewUnresolved(bound_names[i], LET);
3878 Declaration* tdz_decl = factory()->NewVariableDeclaration( 3867 Declaration* tdz_decl = factory()->NewVariableDeclaration(
3879 tdz_proxy, LET, scope(), kNoSourcePosition); 3868 tdz_proxy, LET, scope(), kNoSourcePosition);
3880 Variable* tdz_var = Declare( 3869 Variable* tdz_var = Declare(
3881 tdz_decl, DeclarationDescriptor::NORMAL, true, CHECK_OK); 3870 tdz_decl, DeclarationDescriptor::NORMAL, true, CHECK_OK);
3882 tdz_var->set_initializer_position(position()); 3871 tdz_var->set_initializer_position(position());
3883 } 3872 }
3884 } 3873 }
3885 3874
3886 for_scope->set_end_position(scanner()->location().end_pos); 3875 for_state.set_end_position(scanner()->location().end_pos);
3887 for_scope = for_scope->FinalizeBlockScope(); 3876 Scope* for_scope = for_state.FinalizedBlockScope();
3888 // Parsed for-in loop w/ variable declarations. 3877 // Parsed for-in loop w/ variable declarations.
3889 if (init_block != nullptr) { 3878 if (init_block != nullptr) {
3890 init_block->statements()->Add(final_loop, zone()); 3879 init_block->statements()->Add(final_loop, zone());
3891 init_block->set_scope(for_scope); 3880 init_block->set_scope(for_scope);
3892 return init_block; 3881 return init_block;
3893 } else { 3882 } else {
3894 DCHECK_NULL(for_scope); 3883 DCHECK_NULL(for_scope);
3895 return final_loop; 3884 return final_loop;
3896 } 3885 }
3897 } else { 3886 } else {
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
3940 } 3929 }
3941 3930
3942 Expect(Token::RPAREN, CHECK_OK); 3931 Expect(Token::RPAREN, CHECK_OK);
3943 3932
3944 // For legacy compat reasons, give for loops similar treatment to 3933 // For legacy compat reasons, give for loops similar treatment to
3945 // if statements in allowing a function declaration for a body 3934 // if statements in allowing a function declaration for a body
3946 Statement* body = ParseScopedStatement(NULL, true, CHECK_OK); 3935 Statement* body = ParseScopedStatement(NULL, true, CHECK_OK);
3947 Statement* final_loop = InitializeForEachStatement( 3936 Statement* final_loop = InitializeForEachStatement(
3948 loop, expression, enumerable, body, each_keyword_position); 3937 loop, expression, enumerable, body, each_keyword_position);
3949 3938
3950 for_scope->set_end_position(scanner()->location().end_pos); 3939 DCHECK_NULL(for_state.FinalizedBlockScope());
3951 for_scope = for_scope->FinalizeBlockScope();
3952 DCHECK(for_scope == nullptr);
3953 return final_loop; 3940 return final_loop;
3954 3941
3955 } else { 3942 } else {
3956 init = factory()->NewExpressionStatement(expression, lhs_beg_pos); 3943 init = factory()->NewExpressionStatement(expression, lhs_beg_pos);
3957 } 3944 }
3958 } 3945 }
3959 } 3946 }
3960 3947
3961 // Standard 'for' loop 3948 // Standard 'for' loop
3962 ForStatement* loop = factory()->NewForStatement(labels, stmt_pos); 3949 ForStatement* loop = factory()->NewForStatement(labels, stmt_pos);
3963 Target target(&this->target_stack_, loop); 3950 Target target(&this->target_stack_, loop);
3964 3951
3965 // Parsed initializer at this point. 3952 // Parsed initializer at this point.
3966 Expect(Token::SEMICOLON, CHECK_OK); 3953 Expect(Token::SEMICOLON, CHECK_OK);
3967 3954
3968 Expression* cond = NULL; 3955 Expression* cond = NULL;
3969 Statement* next = NULL; 3956 Statement* next = NULL;
3970 Statement* body = NULL; 3957 Statement* body = NULL;
3971 3958
3972 // If there are let bindings, then condition and the next statement of the 3959 // If there are let bindings, then condition and the next statement of the
3973 // for loop must be parsed in a new scope. 3960 // for loop must be parsed in a new scope.
3974 Scope* inner_scope = scope(); 3961 Scope* inner_scope = scope();
3962 // TODO(verwaest): Allocate this through a ScopeState as well.
3975 if (bound_names_are_lexical && bound_names.length() > 0) { 3963 if (bound_names_are_lexical && bound_names.length() > 0) {
3976 inner_scope = NewScopeWithParent(for_scope, BLOCK_SCOPE); 3964 inner_scope = NewScopeWithParent(inner_scope, BLOCK_SCOPE);
3977 inner_scope->set_start_position(scanner()->location().beg_pos); 3965 inner_scope->set_start_position(scanner()->location().beg_pos);
3978 } 3966 }
3979 { 3967 {
3980 BlockState block_state(&scope_state_, inner_scope); 3968 BlockState block_state(&scope_state_, inner_scope);
3981 3969
3982 if (peek() != Token::SEMICOLON) { 3970 if (peek() != Token::SEMICOLON) {
3983 cond = ParseExpression(true, CHECK_OK); 3971 cond = ParseExpression(true, CHECK_OK);
3984 } 3972 }
3985 Expect(Token::SEMICOLON, CHECK_OK); 3973 Expect(Token::SEMICOLON, CHECK_OK);
3986 3974
3987 if (peek() != Token::RPAREN) { 3975 if (peek() != Token::RPAREN) {
3988 Expression* exp = ParseExpression(true, CHECK_OK); 3976 Expression* exp = ParseExpression(true, CHECK_OK);
3989 next = factory()->NewExpressionStatement(exp, exp->position()); 3977 next = factory()->NewExpressionStatement(exp, exp->position());
3990 } 3978 }
3991 Expect(Token::RPAREN, CHECK_OK); 3979 Expect(Token::RPAREN, CHECK_OK);
3992 3980
3993 body = ParseScopedStatement(NULL, true, CHECK_OK); 3981 body = ParseScopedStatement(NULL, true, CHECK_OK);
3994 } 3982 }
3995 3983
3996 Statement* result = NULL; 3984 Statement* result = NULL;
3997 if (bound_names_are_lexical && bound_names.length() > 0) { 3985 if (bound_names_are_lexical && bound_names.length() > 0) {
3998 BlockState block_state(&scope_state_, for_scope);
3999 result = DesugarLexicalBindingsInForStatement( 3986 result = DesugarLexicalBindingsInForStatement(
4000 inner_scope, parsing_result.descriptor.mode, &bound_names, loop, init, 3987 inner_scope, parsing_result.descriptor.mode, &bound_names, loop, init,
4001 cond, next, body, CHECK_OK); 3988 cond, next, body, CHECK_OK);
4002 for_scope->set_end_position(scanner()->location().end_pos); 3989 for_state.set_end_position(scanner()->location().end_pos);
4003 } else { 3990 } else {
4004 for_scope->set_end_position(scanner()->location().end_pos); 3991 for_state.set_end_position(scanner()->location().end_pos);
4005 for_scope = for_scope->FinalizeBlockScope(); 3992 Scope* for_scope = for_state.FinalizedBlockScope();
4006 if (for_scope) { 3993 if (for_scope) {
4007 // Rewrite a for statement of the form 3994 // Rewrite a for statement of the form
4008 // for (const x = i; c; n) b 3995 // for (const x = i; c; n) b
4009 // 3996 //
4010 // into 3997 // into
4011 // 3998 //
4012 // { 3999 // {
4013 // const x = i; 4000 // const x = i;
4014 // for (; c; n) b 4001 // for (; c; n) b
4015 // } 4002 // }
(...skipping 991 matching lines...) Expand 10 before | Expand all | Expand 10 after
5007 Expression* Parser::ParseClassLiteral(ExpressionClassifier* classifier, 4994 Expression* Parser::ParseClassLiteral(ExpressionClassifier* classifier,
5008 const AstRawString* name, 4995 const AstRawString* name,
5009 Scanner::Location class_name_location, 4996 Scanner::Location class_name_location,
5010 bool name_is_strict_reserved, int pos, 4997 bool name_is_strict_reserved, int pos,
5011 bool* ok) { 4998 bool* ok) {
5012 // All parts of a ClassDeclaration and ClassExpression are strict code. 4999 // All parts of a ClassDeclaration and ClassExpression are strict code.
5013 if (name_is_strict_reserved) { 5000 if (name_is_strict_reserved) {
5014 ReportMessageAt(class_name_location, 5001 ReportMessageAt(class_name_location,
5015 MessageTemplate::kUnexpectedStrictReserved); 5002 MessageTemplate::kUnexpectedStrictReserved);
5016 *ok = false; 5003 *ok = false;
5017 return NULL; 5004 return nullptr;
5018 } 5005 }
5019 if (IsEvalOrArguments(name)) { 5006 if (IsEvalOrArguments(name)) {
5020 ReportMessageAt(class_name_location, MessageTemplate::kStrictEvalArguments); 5007 ReportMessageAt(class_name_location, MessageTemplate::kStrictEvalArguments);
5021 *ok = false; 5008 *ok = false;
5022 return NULL; 5009 return nullptr;
5023 } 5010 }
5024 5011
5025 Scope* block_scope = NewScope(BLOCK_SCOPE); 5012 BlockState block_state(&scope_state_);
5026 BlockState block_state(&scope_state_, block_scope);
5027 RaiseLanguageMode(STRICT); 5013 RaiseLanguageMode(STRICT);
5028 scope()->SetScopeName(name); 5014 scope()->SetScopeName(name);
5029 5015
5030 VariableProxy* proxy = NULL; 5016 VariableProxy* proxy = nullptr;
5031 if (name != NULL) { 5017 if (name != nullptr) {
5032 proxy = NewUnresolved(name, CONST); 5018 proxy = NewUnresolved(name, CONST);
5033 Declaration* declaration = 5019 // TODO(verwaest): declare via block_state.
5034 factory()->NewVariableDeclaration(proxy, CONST, block_scope, pos); 5020 Declaration* declaration = factory()->NewVariableDeclaration(
5021 proxy, CONST, block_state.scope(), pos);
5035 Declare(declaration, DeclarationDescriptor::NORMAL, true, CHECK_OK); 5022 Declare(declaration, DeclarationDescriptor::NORMAL, true, CHECK_OK);
5036 } 5023 }
5037 5024
5038 Expression* extends = NULL; 5025 Expression* extends = nullptr;
5039 if (Check(Token::EXTENDS)) { 5026 if (Check(Token::EXTENDS)) {
5040 block_scope->set_start_position(scanner()->location().end_pos); 5027 block_state.set_start_position(scanner()->location().end_pos);
5041 ExpressionClassifier extends_classifier(this); 5028 ExpressionClassifier extends_classifier(this);
5042 extends = ParseLeftHandSideExpression(&extends_classifier, CHECK_OK); 5029 extends = ParseLeftHandSideExpression(&extends_classifier, CHECK_OK);
5043 CheckNoTailCallExpressions(&extends_classifier, CHECK_OK); 5030 CheckNoTailCallExpressions(&extends_classifier, CHECK_OK);
5044 RewriteNonPattern(&extends_classifier, CHECK_OK); 5031 RewriteNonPattern(&extends_classifier, CHECK_OK);
5045 if (classifier != nullptr) { 5032 if (classifier != nullptr) {
5046 classifier->Accumulate(&extends_classifier, 5033 classifier->Accumulate(&extends_classifier,
5047 ExpressionClassifier::ExpressionProductions); 5034 ExpressionClassifier::ExpressionProductions);
5048 } 5035 }
5049 } else { 5036 } else {
5050 block_scope->set_start_position(scanner()->location().end_pos); 5037 block_state.set_start_position(scanner()->location().end_pos);
5051 } 5038 }
5052 5039
5053 5040
5054 ClassLiteralChecker checker(this); 5041 ClassLiteralChecker checker(this);
5055 ZoneList<ObjectLiteral::Property*>* properties = NewPropertyList(4, zone()); 5042 ZoneList<ObjectLiteral::Property*>* properties = NewPropertyList(4, zone());
5056 FunctionLiteral* constructor = NULL; 5043 FunctionLiteral* constructor = nullptr;
5057 bool has_seen_constructor = false; 5044 bool has_seen_constructor = false;
5058 5045
5059 Expect(Token::LBRACE, CHECK_OK); 5046 Expect(Token::LBRACE, CHECK_OK);
5060 5047
5061 const bool has_extends = extends != nullptr; 5048 const bool has_extends = extends != nullptr;
5062 while (peek() != Token::RBRACE) { 5049 while (peek() != Token::RBRACE) {
5063 if (Check(Token::SEMICOLON)) continue; 5050 if (Check(Token::SEMICOLON)) continue;
5064 FuncNameInferrer::State fni_state(fni_); 5051 FuncNameInferrer::State fni_state(fni_);
5065 const bool in_class = true; 5052 const bool in_class = true;
5066 bool is_computed_name = false; // Classes do not care about computed 5053 bool is_computed_name = false; // Classes do not care about computed
5067 // property names here. 5054 // property names here.
5068 ExpressionClassifier property_classifier(this); 5055 ExpressionClassifier property_classifier(this);
5069 const AstRawString* property_name = nullptr; 5056 const AstRawString* property_name = nullptr;
5070 ObjectLiteral::Property* property = ParsePropertyDefinition( 5057 ObjectLiteral::Property* property = ParsePropertyDefinition(
5071 &checker, in_class, has_extends, MethodKind::Normal, &is_computed_name, 5058 &checker, in_class, has_extends, MethodKind::Normal, &is_computed_name,
5072 &has_seen_constructor, &property_classifier, &property_name, CHECK_OK); 5059 &has_seen_constructor, &property_classifier, &property_name, CHECK_OK);
5073 RewriteNonPattern(&property_classifier, CHECK_OK); 5060 RewriteNonPattern(&property_classifier, CHECK_OK);
5074 if (classifier != nullptr) { 5061 if (classifier != nullptr) {
5075 classifier->Accumulate(&property_classifier, 5062 classifier->Accumulate(&property_classifier,
5076 ExpressionClassifier::ExpressionProductions); 5063 ExpressionClassifier::ExpressionProductions);
5077 } 5064 }
5078 5065
5079 if (has_seen_constructor && constructor == NULL) { 5066 if (has_seen_constructor && constructor == nullptr) {
5080 constructor = GetPropertyValue(property)->AsFunctionLiteral(); 5067 constructor = GetPropertyValue(property)->AsFunctionLiteral();
5081 DCHECK_NOT_NULL(constructor); 5068 DCHECK_NOT_NULL(constructor);
5082 constructor->set_raw_name( 5069 constructor->set_raw_name(
5083 name != nullptr ? name : ast_value_factory()->empty_string()); 5070 name != nullptr ? name : ast_value_factory()->empty_string());
5084 } else { 5071 } else {
5085 properties->Add(property, zone()); 5072 properties->Add(property, zone());
5086 } 5073 }
5087 5074
5088 if (fni_ != NULL) fni_->Infer(); 5075 if (fni_ != nullptr) fni_->Infer();
5089 5076
5090 if (property_name != ast_value_factory()->constructor_string()) { 5077 if (property_name != ast_value_factory()->constructor_string()) {
5091 SetFunctionNameFromPropertyName(property, property_name); 5078 SetFunctionNameFromPropertyName(property, property_name);
5092 } 5079 }
5093 } 5080 }
5094 5081
5095 Expect(Token::RBRACE, CHECK_OK); 5082 Expect(Token::RBRACE, CHECK_OK);
5096 int end_pos = scanner()->location().end_pos; 5083 int end_pos = scanner()->location().end_pos;
5097 5084
5098 if (constructor == NULL) { 5085 if (constructor == nullptr) {
5099 DCHECK_EQ(scope(), block_scope);
5100 constructor = DefaultConstructor(name, has_extends, pos, end_pos, 5086 constructor = DefaultConstructor(name, has_extends, pos, end_pos,
5101 block_scope->language_mode()); 5087 block_state.language_mode());
5102 } 5088 }
5103 5089
5104 // Note that we do not finalize this block scope because it is 5090 // Note that we do not finalize this block scope because it is
5105 // used as a sentinel value indicating an anonymous class. 5091 // used as a sentinel value indicating an anonymous class.
5106 block_scope->set_end_position(end_pos); 5092 block_state.set_end_position(end_pos);
5107 5093
5108 if (name != NULL) { 5094 if (name != nullptr) {
5109 DCHECK_NOT_NULL(proxy); 5095 DCHECK_NOT_NULL(proxy);
5110 proxy->var()->set_initializer_position(end_pos); 5096 proxy->var()->set_initializer_position(end_pos);
5111 } 5097 }
5112 5098
5113 Block* do_block = factory()->NewBlock(nullptr, 1, false, pos); 5099 Block* do_block = factory()->NewBlock(nullptr, 1, false, pos);
5114 do_block->set_scope(block_scope);
5115 Variable* result_var = 5100 Variable* result_var =
5116 block_scope->NewTemporary(ast_value_factory()->empty_string()); 5101 scope()->NewTemporary(ast_value_factory()->empty_string());
5102 do_block->set_scope(block_state.FinalizedBlockScope());
5117 DoExpression* do_expr = factory()->NewDoExpression(do_block, result_var, pos); 5103 DoExpression* do_expr = factory()->NewDoExpression(do_block, result_var, pos);
5118 5104
5119 ClassLiteral* class_literal = factory()->NewClassLiteral( 5105 ClassLiteral* class_literal = factory()->NewClassLiteral(
5120 proxy, extends, constructor, properties, pos, end_pos); 5106 proxy, extends, constructor, properties, pos, end_pos);
5121 5107
5122 do_block->statements()->Add( 5108 do_block->statements()->Add(
5123 factory()->NewExpressionStatement(class_literal, pos), zone()); 5109 factory()->NewExpressionStatement(class_literal, pos), zone());
5124 do_expr->set_represented_function(constructor); 5110 do_expr->set_represented_function(constructor);
5125 Rewriter::Rewrite(this, scope()->ClosureScope(), do_expr, 5111 Rewriter::Rewrite(this, scope()->ClosureScope(), do_expr,
5126 ast_value_factory()); 5112 ast_value_factory());
(...skipping 1975 matching lines...) Expand 10 before | Expand all | Expand 10 after
7102 node->Print(Isolate::Current()); 7088 node->Print(Isolate::Current());
7103 } 7089 }
7104 #endif // DEBUG 7090 #endif // DEBUG
7105 7091
7106 #undef CHECK_OK 7092 #undef CHECK_OK
7107 #undef CHECK_OK_VOID 7093 #undef CHECK_OK_VOID
7108 #undef CHECK_FAILED 7094 #undef CHECK_FAILED
7109 7095
7110 } // namespace internal 7096 } // namespace internal
7111 } // namespace v8 7097 } // namespace v8
OLDNEW
« 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