Index: src/parsing/parser-base.h |
diff --git a/src/parsing/parser-base.h b/src/parsing/parser-base.h |
index 8d7c100001240b22c0a7b4d7825241dcee6cf28d..ac301eca6319e5adf9884d430f61cd17681317a4 100644 |
--- a/src/parsing/parser-base.h |
+++ b/src/parsing/parser-base.h |
@@ -59,10 +59,27 @@ static inline bool operator&(ParseFunctionFlags bitfield, |
struct FormalParametersBase { |
explicit FormalParametersBase(DeclarationScope* scope) : scope(scope) {} |
+ |
+ int num_parameters() const { |
+ // Don't include the rest parameter into the function's formal parameter |
+ // count (esp. the SharedFunctionInfo::internal_formal_parameter_count, |
+ // which says whether we need to create an arguments adaptor frame). |
+ return arity - has_rest; |
+ } |
+ |
+ void UpdateArityAndFunctionLength(bool is_optional, bool is_rest) { |
+ if (!is_optional && !is_rest && function_length == arity) { |
+ ++function_length; |
+ } |
+ ++arity; |
+ } |
+ |
DeclarationScope* scope; |
bool has_rest = false; |
bool is_simple = true; |
int materialized_literals_count = 0; |
+ int function_length = 0; |
+ int arity = 0; |
}; |
@@ -2284,7 +2301,7 @@ ParserBase<Impl>::ParseClassFieldForInitializer(bool has_initializer, |
FunctionLiteralT function_literal = factory()->NewFunctionLiteral( |
impl()->EmptyIdentifierString(), initializer_scope, body, |
initializer_state.materialized_literal_count(), |
- initializer_state.expected_property_count(), 0, |
+ initializer_state.expected_property_count(), 0, 0, |
FunctionLiteral::kNoDuplicateParameters, |
FunctionLiteral::kAnonymousExpression, default_eager_compile_hint_, |
initializer_scope->start_position()); |
@@ -3479,11 +3496,11 @@ void ParserBase<Impl>::ParseFormalParameterList(FormalParametersT* parameters, |
// FormalParameter[?Yield] |
// FormalParameterList[?Yield] , FormalParameter[?Yield] |
- DCHECK_EQ(0, parameters->Arity()); |
+ DCHECK_EQ(0, parameters->arity); |
if (peek() != Token::RPAREN) { |
while (true) { |
- if (parameters->Arity() > Code::kMaxArguments) { |
+ if (parameters->arity > Code::kMaxArguments) { |
ReportMessage(MessageTemplate::kTooManyParameters); |
*ok = false; |
return; |
@@ -3510,7 +3527,7 @@ void ParserBase<Impl>::ParseFormalParameterList(FormalParametersT* parameters, |
} |
} |
- for (int i = 0; i < parameters->Arity(); ++i) { |
+ for (int i = 0; i < parameters->arity; ++i) { |
auto parameter = parameters->at(i); |
impl()->DeclareFormalParameter(parameters->scope, parameter); |
} |
@@ -3912,7 +3929,6 @@ ParserBase<Impl>::ParseArrowFunctionLiteral( |
} |
StatementListT body = impl()->NullStatementList(); |
- int num_parameters = formal_parameters.scope->num_parameters(); |
int materialized_literal_count = -1; |
int expected_property_count = -1; |
@@ -4027,7 +4043,8 @@ ParserBase<Impl>::ParseArrowFunctionLiteral( |
FunctionLiteralT function_literal = factory()->NewFunctionLiteral( |
impl()->EmptyIdentifierString(), formal_parameters.scope, body, |
- materialized_literal_count, expected_property_count, num_parameters, |
+ materialized_literal_count, expected_property_count, |
+ formal_parameters.num_parameters(), formal_parameters.function_length, |
FunctionLiteral::kNoDuplicateParameters, |
FunctionLiteral::kAnonymousExpression, eager_compile_hint, |
formal_parameters.scope->start_position()); |