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

Side by Side Diff: src/parsing/parser.cc

Issue 2367383002: Don't track function-kind through FunctionState, always read from underlying scope (Closed)
Patch Set: rebase Created 4 years, 2 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-expression-rewriter.h" 10 #include "src/ast/ast-expression-rewriter.h"
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after
225 DeclarationScope* function_scope = NewFunctionScope(kind); 225 DeclarationScope* function_scope = NewFunctionScope(kind);
226 SetLanguageMode(function_scope, 226 SetLanguageMode(function_scope,
227 static_cast<LanguageMode>(language_mode | STRICT)); 227 static_cast<LanguageMode>(language_mode | STRICT));
228 // Set start and end position to the same value 228 // Set start and end position to the same value
229 function_scope->set_start_position(pos); 229 function_scope->set_start_position(pos);
230 function_scope->set_end_position(pos); 230 function_scope->set_end_position(pos);
231 ZoneList<Statement*>* body = NULL; 231 ZoneList<Statement*>* body = NULL;
232 232
233 { 233 {
234 FunctionState function_state(&function_state_, &scope_state_, 234 FunctionState function_state(&function_state_, &scope_state_,
235 function_scope, kind); 235 function_scope);
236 236
237 body = new (zone()) ZoneList<Statement*>(call_super ? 2 : 1, zone()); 237 body = new (zone()) ZoneList<Statement*>(call_super ? 2 : 1, zone());
238 if (call_super) { 238 if (call_super) {
239 // $super_constructor = %_GetSuperConstructor(<this-function>) 239 // $super_constructor = %_GetSuperConstructor(<this-function>)
240 // %reflect_construct( 240 // %reflect_construct(
241 // $super_constructor, InternalArray(...args), new.target) 241 // $super_constructor, InternalArray(...args), new.target)
242 auto constructor_args_name = ast_value_factory()->empty_string(); 242 auto constructor_args_name = ast_value_factory()->empty_string();
243 bool is_duplicate; 243 bool is_duplicate;
244 bool is_rest = true; 244 bool is_rest = true;
245 bool is_optional = false; 245 bool is_optional = false;
(...skipping 533 matching lines...) Expand 10 before | Expand all | Expand 10 after
779 // declared at the module level but not MODULE-allocated. 779 // declared at the module level but not MODULE-allocated.
780 parsing_mode = PARSE_EAGERLY; 780 parsing_mode = PARSE_EAGERLY;
781 } 781 }
782 782
783 DeclarationScope* scope = outer->AsDeclarationScope(); 783 DeclarationScope* scope = outer->AsDeclarationScope();
784 784
785 scope->set_start_position(0); 785 scope->set_start_position(0);
786 786
787 // Enter 'scope' with the given parsing mode. 787 // Enter 'scope' with the given parsing mode.
788 ParsingModeScope parsing_mode_scope(this, parsing_mode); 788 ParsingModeScope parsing_mode_scope(this, parsing_mode);
789 FunctionState function_state(&function_state_, &scope_state_, scope, 789 FunctionState function_state(&function_state_, &scope_state_, scope);
790 kNormalFunction);
791 790
792 ZoneList<Statement*>* body = new(zone()) ZoneList<Statement*>(16, zone()); 791 ZoneList<Statement*>* body = new(zone()) ZoneList<Statement*>(16, zone());
793 bool ok = true; 792 bool ok = true;
794 int beg_pos = scanner()->location().beg_pos; 793 int beg_pos = scanner()->location().beg_pos;
795 parsing_module_ = info->is_module(); 794 parsing_module_ = info->is_module();
796 if (parsing_module_) { 795 if (parsing_module_) {
797 // Declare the special module parameter. 796 // Declare the special module parameter.
798 auto name = ast_value_factory()->empty_string(); 797 auto name = ast_value_factory()->empty_string();
799 bool is_duplicate; 798 bool is_duplicate;
800 bool is_rest = false; 799 bool is_rest = false;
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
929 928
930 // Place holder for the result. 929 // Place holder for the result.
931 FunctionLiteral* result = nullptr; 930 FunctionLiteral* result = nullptr;
932 931
933 { 932 {
934 // Parse the function literal. 933 // Parse the function literal.
935 Scope* outer = original_scope_; 934 Scope* outer = original_scope_;
936 DeclarationScope* outer_function = outer->GetClosureScope(); 935 DeclarationScope* outer_function = outer->GetClosureScope();
937 DCHECK(outer); 936 DCHECK(outer);
938 FunctionState function_state(&function_state_, &scope_state_, 937 FunctionState function_state(&function_state_, &scope_state_,
939 outer_function, 938 outer_function);
940 outer_function->function_kind());
941 BlockState block_state(&scope_state_, outer); 939 BlockState block_state(&scope_state_, outer);
942 DCHECK(is_sloppy(outer->language_mode()) || 940 DCHECK(is_sloppy(outer->language_mode()) ||
943 is_strict(info->language_mode())); 941 is_strict(info->language_mode()));
944 FunctionLiteral::FunctionType function_type = ComputeFunctionType(info); 942 FunctionLiteral::FunctionType function_type = ComputeFunctionType(info);
945 bool ok = true; 943 bool ok = true;
946 944
947 if (info->is_arrow()) { 945 if (info->is_arrow()) {
948 bool is_async = allow_harmony_async_await() && info->is_async(); 946 bool is_async = allow_harmony_async_await() && info->is_async();
949 if (is_async) { 947 if (is_async) {
950 DCHECK(!scanner()->HasAnyLineTerminatorAfterNext()); 948 DCHECK(!scanner()->HasAnyLineTerminatorAfterNext());
951 if (!Check(Token::ASYNC)) { 949 if (!Check(Token::ASYNC)) {
952 CHECK(stack_overflow()); 950 CHECK(stack_overflow());
953 return nullptr; 951 return nullptr;
954 } 952 }
955 if (!(peek_any_identifier() || peek() == Token::LPAREN)) { 953 if (!(peek_any_identifier() || peek() == Token::LPAREN)) {
956 CHECK(stack_overflow()); 954 CHECK(stack_overflow());
957 return nullptr; 955 return nullptr;
958 } 956 }
959 } 957 }
960 958
961 // TODO(adamk): We should construct this scope from the ScopeInfo. 959 // TODO(adamk): We should construct this scope from the ScopeInfo.
962 DeclarationScope* scope = NewFunctionScope(FunctionKind::kArrowFunction); 960 FunctionKind arrow_kind = is_async ? kAsyncArrowFunction : kArrowFunction;
961 DeclarationScope* scope = NewFunctionScope(arrow_kind);
963 962
964 // These two bits only need to be explicitly set because we're 963 // These two bits only need to be explicitly set because we're
965 // not passing the ScopeInfo to the Scope constructor. 964 // not passing the ScopeInfo to the Scope constructor.
966 // TODO(adamk): Remove these calls once the above NewScope call 965 // TODO(adamk): Remove these calls once the above NewScope call
967 // passes the ScopeInfo. 966 // passes the ScopeInfo.
968 if (info->calls_eval()) { 967 if (info->calls_eval()) {
969 scope->RecordEvalCall(); 968 scope->RecordEvalCall();
970 } 969 }
971 SetLanguageMode(scope, info->language_mode()); 970 SetLanguageMode(scope, info->language_mode());
972 971
(...skipping 14 matching lines...) Expand all
987 // BindingIdentifier 986 // BindingIdentifier
988 ParseFormalParameter(&formals, &ok); 987 ParseFormalParameter(&formals, &ok);
989 if (ok) DeclareFormalParameter(formals.scope, formals.at(0)); 988 if (ok) DeclareFormalParameter(formals.scope, formals.at(0));
990 } 989 }
991 } 990 }
992 991
993 if (ok) { 992 if (ok) {
994 checkpoint.Restore(&formals.materialized_literals_count); 993 checkpoint.Restore(&formals.materialized_literals_count);
995 // Pass `accept_IN=true` to ParseArrowFunctionLiteral --- This should 994 // Pass `accept_IN=true` to ParseArrowFunctionLiteral --- This should
996 // not be observable, or else the preparser would have failed. 995 // not be observable, or else the preparser would have failed.
997 Expression* expression = 996 Expression* expression = ParseArrowFunctionLiteral(true, formals, &ok);
998 ParseArrowFunctionLiteral(true, formals, is_async, &ok);
999 if (ok) { 997 if (ok) {
1000 // Scanning must end at the same position that was recorded 998 // Scanning must end at the same position that was recorded
1001 // previously. If not, parsing has been interrupted due to a stack 999 // previously. If not, parsing has been interrupted due to a stack
1002 // overflow, at which point the partially parsed arrow function 1000 // overflow, at which point the partially parsed arrow function
1003 // concise body happens to be a valid expression. This is a problem 1001 // concise body happens to be a valid expression. This is a problem
1004 // only for arrow functions with single expression bodies, since there 1002 // only for arrow functions with single expression bodies, since there
1005 // is no end token such as "}" for normal functions. 1003 // is no end token such as "}" for normal functions.
1006 if (scanner()->location().end_pos == info->end_position()) { 1004 if (scanner()->location().end_pos == info->end_position()) {
1007 // The pre-parser saw an arrow function here, so the full parser 1005 // The pre-parser saw an arrow function here, so the full parser
1008 // must produce a FunctionLiteral. 1006 // must produce a FunctionLiteral.
(...skipping 1767 matching lines...) Expand 10 before | Expand all | Expand 10 after
2776 DiscardableZoneScope zone_scope(this, &temp_zone, use_temp_zone); 2774 DiscardableZoneScope zone_scope(this, &temp_zone, use_temp_zone);
2777 2775
2778 DeclarationScope* scope = NewFunctionScope(kind); 2776 DeclarationScope* scope = NewFunctionScope(kind);
2779 SetLanguageMode(scope, language_mode); 2777 SetLanguageMode(scope, language_mode);
2780 if (!use_temp_zone) { 2778 if (!use_temp_zone) {
2781 main_scope = scope; 2779 main_scope = scope;
2782 } else { 2780 } else {
2783 DCHECK(main_scope->zone() != scope->zone()); 2781 DCHECK(main_scope->zone() != scope->zone());
2784 } 2782 }
2785 2783
2786 FunctionState function_state(&function_state_, &scope_state_, scope, kind); 2784 FunctionState function_state(&function_state_, &scope_state_, scope);
2787 #ifdef DEBUG 2785 #ifdef DEBUG
2788 scope->SetScopeName(function_name); 2786 scope->SetScopeName(function_name);
2789 #endif 2787 #endif
2790 ExpressionClassifier formals_classifier(this, &duplicate_finder); 2788 ExpressionClassifier formals_classifier(this, &duplicate_finder);
2791 2789
2792 if (is_generator) { 2790 if (is_generator) {
2793 // For generators, allocating variables in contexts is currently a win 2791 // For generators, allocating variables in contexts is currently a win
2794 // because it minimizes the work needed to suspend and resume an 2792 // because it minimizes the work needed to suspend and resume an
2795 // activation. The machine code produced for generators (by full-codegen) 2793 // activation. The machine code produced for generators (by full-codegen)
2796 // relies on this forced context allocation, but not in an essential way. 2794 // relies on this forced context allocation, but not in an essential way.
(...skipping 748 matching lines...) Expand 10 before | Expand all | Expand 10 after
3545 // .class-field-0-func(), 3543 // .class-field-0-func(),
3546 // DONT_ENUM, false) 3544 // DONT_ENUM, false)
3547 3545
3548 RaiseLanguageMode(STRICT); 3546 RaiseLanguageMode(STRICT);
3549 FunctionKind kind = FunctionKind::kConciseMethod; 3547 FunctionKind kind = FunctionKind::kConciseMethod;
3550 DeclarationScope* initializer_scope = NewFunctionScope(kind); 3548 DeclarationScope* initializer_scope = NewFunctionScope(kind);
3551 SetLanguageMode(initializer_scope, language_mode()); 3549 SetLanguageMode(initializer_scope, language_mode());
3552 initializer_scope->set_start_position(scanner()->location().end_pos); 3550 initializer_scope->set_start_position(scanner()->location().end_pos);
3553 initializer_scope->set_end_position(scanner()->location().end_pos); 3551 initializer_scope->set_end_position(scanner()->location().end_pos);
3554 FunctionState initializer_state(&function_state_, &scope_state_, 3552 FunctionState initializer_state(&function_state_, &scope_state_,
3555 initializer_scope, kind); 3553 initializer_scope);
3556 ZoneList<Statement*>* body = new (zone()) ZoneList<Statement*>(count, zone()); 3554 ZoneList<Statement*>* body = new (zone()) ZoneList<Statement*>(count, zone());
3557 for (int i = 0; i < count; ++i) { 3555 for (int i = 0; i < count; ++i) {
3558 const AstRawString* name = 3556 const AstRawString* name =
3559 ClassFieldVariableName(true, ast_value_factory(), i); 3557 ClassFieldVariableName(true, ast_value_factory(), i);
3560 VariableProxy* name_proxy = scope()->NewUnresolved(factory(), name); 3558 VariableProxy* name_proxy = scope()->NewUnresolved(factory(), name);
3561 const AstRawString* function_name = 3559 const AstRawString* function_name =
3562 ClassFieldVariableName(false, ast_value_factory(), i); 3560 ClassFieldVariableName(false, ast_value_factory(), i);
3563 VariableProxy* function_proxy = 3561 VariableProxy* function_proxy =
3564 scope()->NewUnresolved(factory(), function_name); 3562 scope()->NewUnresolved(factory(), function_name);
3565 ZoneList<Expression*>* args = new (zone()) ZoneList<Expression*>(2, zone()); 3563 ZoneList<Expression*>* args = new (zone()) ZoneList<Expression*>(2, zone());
(...skipping 2039 matching lines...) Expand 10 before | Expand all | Expand 10 after
5605 5603
5606 return final_loop; 5604 return final_loop;
5607 } 5605 }
5608 5606
5609 #undef CHECK_OK 5607 #undef CHECK_OK
5610 #undef CHECK_OK_VOID 5608 #undef CHECK_OK_VOID
5611 #undef CHECK_FAILED 5609 #undef CHECK_FAILED
5612 5610
5613 } // namespace internal 5611 } // namespace internal
5614 } // namespace v8 5612 } // 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