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

Side by Side Diff: src/parser.cc

Issue 1259013003: [es6] Refactor FormalParameter (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 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
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/v8.h" 5 #include "src/v8.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 899 matching lines...) Expand 10 before | Expand all | Expand 10 after
910 DCHECK(!info->script().is_null() || info->source_stream() != NULL); 910 DCHECK(!info->script().is_null() || info->source_stream() != NULL);
911 set_allow_lazy(info->allow_lazy_parsing()); 911 set_allow_lazy(info->allow_lazy_parsing());
912 set_allow_natives(FLAG_allow_natives_syntax || info->is_native()); 912 set_allow_natives(FLAG_allow_natives_syntax || info->is_native());
913 set_allow_harmony_modules(!info->is_native() && FLAG_harmony_modules); 913 set_allow_harmony_modules(!info->is_native() && FLAG_harmony_modules);
914 set_allow_harmony_arrow_functions(FLAG_harmony_arrow_functions); 914 set_allow_harmony_arrow_functions(FLAG_harmony_arrow_functions);
915 set_allow_harmony_sloppy(FLAG_harmony_sloppy); 915 set_allow_harmony_sloppy(FLAG_harmony_sloppy);
916 set_allow_harmony_sloppy_let(FLAG_harmony_sloppy_let); 916 set_allow_harmony_sloppy_let(FLAG_harmony_sloppy_let);
917 set_allow_harmony_unicode(FLAG_harmony_unicode); 917 set_allow_harmony_unicode(FLAG_harmony_unicode);
918 set_allow_harmony_computed_property_names( 918 set_allow_harmony_computed_property_names(
919 FLAG_harmony_computed_property_names); 919 FLAG_harmony_computed_property_names);
920 set_allow_harmony_rest_params(FLAG_harmony_rest_parameters); 920 set_allow_harmony_rest_parameters(FLAG_harmony_rest_parameters);
921 set_allow_harmony_spreadcalls(FLAG_harmony_spreadcalls); 921 set_allow_harmony_spreadcalls(FLAG_harmony_spreadcalls);
922 set_allow_harmony_destructuring(FLAG_harmony_destructuring); 922 set_allow_harmony_destructuring(FLAG_harmony_destructuring);
923 set_allow_harmony_spread_arrays(FLAG_harmony_spread_arrays); 923 set_allow_harmony_spread_arrays(FLAG_harmony_spread_arrays);
924 set_allow_harmony_new_target(FLAG_harmony_new_target); 924 set_allow_harmony_new_target(FLAG_harmony_new_target);
925 set_allow_strong_mode(FLAG_strong_mode); 925 set_allow_strong_mode(FLAG_strong_mode);
926 set_allow_legacy_const(FLAG_legacy_const); 926 set_allow_legacy_const(FLAG_legacy_const);
927 for (int feature = 0; feature < v8::Isolate::kUseCounterFeatureCount; 927 for (int feature = 0; feature < v8::Isolate::kUseCounterFeatureCount;
928 ++feature) { 928 ++feature) {
929 use_counts_[feature] = 0; 929 use_counts_[feature] = 0;
930 } 930 }
(...skipping 2909 matching lines...) Expand 10 before | Expand all | Expand 10 after
3840 3840
3841 Handle<FixedArray> CompileTimeValue::GetElements(Handle<FixedArray> value) { 3841 Handle<FixedArray> CompileTimeValue::GetElements(Handle<FixedArray> value) {
3842 return Handle<FixedArray>(FixedArray::cast(value->get(kElementsSlot))); 3842 return Handle<FixedArray>(FixedArray::cast(value->get(kElementsSlot)));
3843 } 3843 }
3844 3844
3845 3845
3846 void ParserTraits::ParseArrowFunctionFormalParameters( 3846 void ParserTraits::ParseArrowFunctionFormalParameters(
3847 ParserFormalParameters* parameters, Expression* expr, 3847 ParserFormalParameters* parameters, Expression* expr,
3848 const Scanner::Location& params_loc, 3848 const Scanner::Location& params_loc,
3849 Scanner::Location* duplicate_loc, bool* ok) { 3849 Scanner::Location* duplicate_loc, bool* ok) {
3850 if (parameters->scope->num_parameters() >= Code::kMaxArguments) { 3850 if (parameters->arity >= Code::kMaxArguments) {
3851 ReportMessageAt(params_loc, MessageTemplate::kMalformedArrowFunParamList); 3851 ReportMessageAt(params_loc, MessageTemplate::kMalformedArrowFunParamList);
3852 *ok = false; 3852 *ok = false;
3853 return; 3853 return;
3854 } 3854 }
3855 3855
3856 // ArrowFunctionFormals :: 3856 // ArrowFunctionFormals ::
3857 // Binary(Token::COMMA, NonTailArrowFunctionFormals, Tail) 3857 // Binary(Token::COMMA, NonTailArrowFunctionFormals, Tail)
3858 // Tail 3858 // Tail
3859 // NonTailArrowFunctionFormals :: 3859 // NonTailArrowFunctionFormals ::
3860 // Binary(Token::COMMA, NonTailArrowFunctionFormals, VariableProxy) 3860 // Binary(Token::COMMA, NonTailArrowFunctionFormals, VariableProxy)
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
3894 3894
3895 if (expr->IsVariableProxy()) { 3895 if (expr->IsVariableProxy()) {
3896 // When the formal parameter was originally seen, it was parsed as a 3896 // When the formal parameter was originally seen, it was parsed as a
3897 // VariableProxy and recorded as unresolved in the scope. Here we undo that 3897 // VariableProxy and recorded as unresolved in the scope. Here we undo that
3898 // parse-time side-effect for parameters that are single-names (not 3898 // parse-time side-effect for parameters that are single-names (not
3899 // patterns; for patterns that happens uniformly in 3899 // patterns; for patterns that happens uniformly in
3900 // PatternRewriter::VisitVariableProxy). 3900 // PatternRewriter::VisitVariableProxy).
3901 parser_->scope_->RemoveUnresolved(expr->AsVariableProxy()); 3901 parser_->scope_->RemoveUnresolved(expr->AsVariableProxy());
3902 } 3902 }
3903 3903
3904 ++parameters->arity;
3904 ExpressionClassifier classifier; 3905 ExpressionClassifier classifier;
3905 DeclareFormalParameter(parameters, expr, is_rest, &classifier); 3906 DeclareFormalParameter(parameters, expr, is_rest, &classifier);
3906 if (!duplicate_loc->IsValid()) { 3907 if (!duplicate_loc->IsValid()) {
3907 *duplicate_loc = classifier.duplicate_formal_parameter_error().location; 3908 *duplicate_loc = classifier.duplicate_formal_parameter_error().location;
3908 } 3909 }
3909 } 3910 }
3910 3911
3911 3912
3912 void ParserTraits::ReindexLiterals(const ParserFormalParameters& parameters) { 3913 void ParserTraits::ReindexLiterals(const ParserFormalParameters& parameters) {
3913 if (parser_->function_state_->materialized_literal_count() > 0) { 3914 if (parser_->function_state_->materialized_literal_count() > 0) {
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
3982 Scope* declaration_scope = scope_->DeclarationScope(); 3983 Scope* declaration_scope = scope_->DeclarationScope();
3983 Scope* original_declaration_scope = original_scope_->DeclarationScope(); 3984 Scope* original_declaration_scope = original_scope_->DeclarationScope();
3984 Scope* scope = function_type == FunctionLiteral::DECLARATION && 3985 Scope* scope = function_type == FunctionLiteral::DECLARATION &&
3985 is_sloppy(language_mode) && !allow_harmony_sloppy() && 3986 is_sloppy(language_mode) && !allow_harmony_sloppy() &&
3986 (original_scope_ == original_declaration_scope || 3987 (original_scope_ == original_declaration_scope ||
3987 declaration_scope != original_declaration_scope) 3988 declaration_scope != original_declaration_scope)
3988 ? NewScope(declaration_scope, FUNCTION_SCOPE, kind) 3989 ? NewScope(declaration_scope, FUNCTION_SCOPE, kind)
3989 : NewScope(scope_, FUNCTION_SCOPE, kind); 3990 : NewScope(scope_, FUNCTION_SCOPE, kind);
3990 scope->SetLanguageMode(language_mode); 3991 scope->SetLanguageMode(language_mode);
3991 ZoneList<Statement*>* body = NULL; 3992 ZoneList<Statement*>* body = NULL;
3992 int arity = 0; 3993 int arity = -1;
3993 int materialized_literal_count = -1; 3994 int materialized_literal_count = -1;
3994 int expected_property_count = -1; 3995 int expected_property_count = -1;
3995 DuplicateFinder duplicate_finder(scanner()->unicode_cache()); 3996 DuplicateFinder duplicate_finder(scanner()->unicode_cache());
3996 ExpressionClassifier formals_classifier(&duplicate_finder); 3997 ExpressionClassifier formals_classifier(&duplicate_finder);
3997 FunctionLiteral::EagerCompileHint eager_compile_hint = 3998 FunctionLiteral::EagerCompileHint eager_compile_hint =
3998 parenthesized_function_ ? FunctionLiteral::kShouldEagerCompile 3999 parenthesized_function_ ? FunctionLiteral::kShouldEagerCompile
3999 : FunctionLiteral::kShouldLazyCompile; 4000 : FunctionLiteral::kShouldLazyCompile;
4000 bool should_be_used_once_hint = false; 4001 bool should_be_used_once_hint = false;
4001 // Parse function. 4002 // Parse function.
4002 { 4003 {
(...skipping 13 matching lines...) Expand all
4016 // expressions. This also marks the FunctionState as a generator. 4017 // expressions. This also marks the FunctionState as a generator.
4017 Variable* temp = scope_->NewTemporary( 4018 Variable* temp = scope_->NewTemporary(
4018 ast_value_factory()->dot_generator_object_string()); 4019 ast_value_factory()->dot_generator_object_string());
4019 function_state.set_generator_object_variable(temp); 4020 function_state.set_generator_object_variable(temp);
4020 } 4021 }
4021 4022
4022 Expect(Token::LPAREN, CHECK_OK); 4023 Expect(Token::LPAREN, CHECK_OK);
4023 int start_position = scanner()->location().beg_pos; 4024 int start_position = scanner()->location().beg_pos;
4024 scope_->set_start_position(start_position); 4025 scope_->set_start_position(start_position);
4025 ParserFormalParameters formals(scope); 4026 ParserFormalParameters formals(scope);
4026 arity = ParseFormalParameterList(&formals, &formals_classifier, CHECK_OK); 4027 ParseFormalParameterList(&formals, &formals_classifier, CHECK_OK);
4028 arity = formals.arity;
4029 DCHECK(arity == formals.params.length());
4027 Expect(Token::RPAREN, CHECK_OK); 4030 Expect(Token::RPAREN, CHECK_OK);
4028 int formals_end_position = scanner()->location().end_pos; 4031 int formals_end_position = scanner()->location().end_pos;
4029 4032
4030 CheckArityRestrictions(arity, arity_restriction, 4033 CheckArityRestrictions(arity, arity_restriction,
4031 formals.has_rest, start_position, 4034 formals.has_rest, start_position,
4032 formals_end_position, CHECK_OK); 4035 formals_end_position, CHECK_OK);
4033 Expect(Token::LBRACE, CHECK_OK); 4036 Expect(Token::LBRACE, CHECK_OK);
4034 4037
4035 // If we have a named function expression, we add a local variable 4038 // If we have a named function expression, we add a local variable
4036 // declaration to the body of the function with the name of the 4039 // declaration to the body of the function with the name of the
(...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after
4305 return if_statement; 4308 return if_statement;
4306 } 4309 }
4307 4310
4308 4311
4309 Block* Parser::BuildParameterInitializationBlock( 4312 Block* Parser::BuildParameterInitializationBlock(
4310 const ParserFormalParameters& parameters, bool* ok) { 4313 const ParserFormalParameters& parameters, bool* ok) {
4311 DCHECK(!parameters.is_simple); 4314 DCHECK(!parameters.is_simple);
4312 DCHECK(scope_->is_function_scope()); 4315 DCHECK(scope_->is_function_scope());
4313 Block* init_block = 4316 Block* init_block =
4314 factory()->NewBlock(NULL, 1, true, RelocInfo::kNoPosition); 4317 factory()->NewBlock(NULL, 1, true, RelocInfo::kNoPosition);
4315 for (auto parameter : parameters.params) { 4318 for (int i = 0; i < parameters.params.length(); ++i) {
4319 auto parameter = parameters.params[i];
4316 if (parameter.pattern == nullptr) continue; 4320 if (parameter.pattern == nullptr) continue;
4317 DeclarationDescriptor descriptor; 4321 DeclarationDescriptor descriptor;
4318 descriptor.declaration_kind = DeclarationDescriptor::PARAMETER; 4322 descriptor.declaration_kind = DeclarationDescriptor::PARAMETER;
4319 descriptor.parser = this; 4323 descriptor.parser = this;
4320 descriptor.declaration_scope = scope_; 4324 descriptor.declaration_scope = scope_;
4321 descriptor.scope = scope_; 4325 descriptor.scope = scope_;
4322 descriptor.mode = LET; 4326 descriptor.mode = LET;
4323 descriptor.is_const = false; 4327 descriptor.is_const = false;
4324 descriptor.needs_init = true; 4328 descriptor.needs_init = true;
4325 descriptor.declaration_pos = parameter.pattern->position(); 4329 descriptor.declaration_pos = parameter.pattern->position();
4326 descriptor.initialization_pos = parameter.pattern->position(); 4330 descriptor.initialization_pos = parameter.pattern->position();
4327 descriptor.init_op = Token::INIT_LET; 4331 descriptor.init_op = Token::INIT_LET;
4328 DeclarationParsingResult::Declaration decl( 4332 DeclarationParsingResult::Declaration decl(
4329 parameter.pattern, parameter.pattern->position(), 4333 parameter.pattern, parameter.pattern->position(),
4330 factory()->NewVariableProxy(parameter.var)); 4334 factory()->NewVariableProxy(parameters.scope->parameter(i)));
4331 PatternRewriter::DeclareAndInitializeVariables(init_block, &descriptor, 4335 PatternRewriter::DeclareAndInitializeVariables(init_block, &descriptor,
4332 &decl, nullptr, CHECK_OK); 4336 &decl, nullptr, CHECK_OK);
4333 } 4337 }
4334 return init_block; 4338 return init_block;
4335 } 4339 }
4336 4340
4337 4341
4338 ZoneList<Statement*>* Parser::ParseEagerFunctionBody( 4342 ZoneList<Statement*>* Parser::ParseEagerFunctionBody(
4339 const AstRawString* function_name, int pos, 4343 const AstRawString* function_name, int pos,
4340 const ParserFormalParameters& parameters, Variable* fvar, 4344 const ParserFormalParameters& parameters, Variable* fvar,
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
4456 NULL, stack_limit_); 4460 NULL, stack_limit_);
4457 reusable_preparser_->set_allow_lazy(true); 4461 reusable_preparser_->set_allow_lazy(true);
4458 #define SET_ALLOW(name) reusable_preparser_->set_allow_##name(allow_##name()); 4462 #define SET_ALLOW(name) reusable_preparser_->set_allow_##name(allow_##name());
4459 SET_ALLOW(natives); 4463 SET_ALLOW(natives);
4460 SET_ALLOW(harmony_modules); 4464 SET_ALLOW(harmony_modules);
4461 SET_ALLOW(harmony_arrow_functions); 4465 SET_ALLOW(harmony_arrow_functions);
4462 SET_ALLOW(harmony_sloppy); 4466 SET_ALLOW(harmony_sloppy);
4463 SET_ALLOW(harmony_sloppy_let); 4467 SET_ALLOW(harmony_sloppy_let);
4464 SET_ALLOW(harmony_unicode); 4468 SET_ALLOW(harmony_unicode);
4465 SET_ALLOW(harmony_computed_property_names); 4469 SET_ALLOW(harmony_computed_property_names);
4466 SET_ALLOW(harmony_rest_params); 4470 SET_ALLOW(harmony_rest_parameters);
4467 SET_ALLOW(harmony_spreadcalls); 4471 SET_ALLOW(harmony_spreadcalls);
4468 SET_ALLOW(harmony_destructuring); 4472 SET_ALLOW(harmony_destructuring);
4469 SET_ALLOW(harmony_spread_arrays); 4473 SET_ALLOW(harmony_spread_arrays);
4470 SET_ALLOW(harmony_new_target); 4474 SET_ALLOW(harmony_new_target);
4471 SET_ALLOW(strong_mode); 4475 SET_ALLOW(strong_mode);
4472 #undef SET_ALLOW 4476 #undef SET_ALLOW
4473 } 4477 }
4474 PreParser::PreParseResult result = reusable_preparser_->PreParseLazyFunction( 4478 PreParser::PreParseResult result = reusable_preparser_->PreParseLazyFunction(
4475 language_mode(), function_state_->kind(), logger, bookmark); 4479 language_mode(), function_state_->kind(), logger, bookmark);
4476 if (pre_parse_timer_ != NULL) { 4480 if (pre_parse_timer_ != NULL) {
(...skipping 1505 matching lines...) Expand 10 before | Expand all | Expand 10 after
5982 Expression* Parser::SpreadCallNew(Expression* function, 5986 Expression* Parser::SpreadCallNew(Expression* function,
5983 ZoneList<v8::internal::Expression*>* args, 5987 ZoneList<v8::internal::Expression*>* args,
5984 int pos) { 5988 int pos) {
5985 args->InsertAt(0, function, zone()); 5989 args->InsertAt(0, function, zone());
5986 5990
5987 return factory()->NewCallRuntime( 5991 return factory()->NewCallRuntime(
5988 ast_value_factory()->reflect_construct_string(), NULL, args, pos); 5992 ast_value_factory()->reflect_construct_string(), NULL, args, pos);
5989 } 5993 }
5990 } // namespace internal 5994 } // namespace internal
5991 } // namespace v8 5995 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698