Index: src/parser.cc |
diff --git a/src/parser.cc b/src/parser.cc |
index e8f3a64190e462c97e6c900432f8d982ec24d1b5..311d192f8e694777f48b339bd723369516a4b816 100644 |
--- a/src/parser.cc |
+++ b/src/parser.cc |
@@ -917,7 +917,7 @@ Parser::Parser(ParseInfo* info) |
set_allow_harmony_unicode(FLAG_harmony_unicode); |
set_allow_harmony_computed_property_names( |
FLAG_harmony_computed_property_names); |
- set_allow_harmony_rest_params(FLAG_harmony_rest_parameters); |
+ set_allow_harmony_rest_parameters(FLAG_harmony_rest_parameters); |
set_allow_harmony_spreadcalls(FLAG_harmony_spreadcalls); |
set_allow_harmony_destructuring(FLAG_harmony_destructuring); |
set_allow_harmony_spread_arrays(FLAG_harmony_spread_arrays); |
@@ -3854,7 +3854,7 @@ void ParserTraits::ParseArrowFunctionFormalParameters( |
ParserFormalParameters* parameters, Expression* expr, |
const Scanner::Location& params_loc, |
Scanner::Location* duplicate_loc, bool* ok) { |
- if (parameters->scope->num_parameters() >= Code::kMaxArguments) { |
+ if (parameters->arity >= Code::kMaxArguments) { |
ReportMessageAt(params_loc, MessageTemplate::kMalformedArrowFunParamList); |
*ok = false; |
return; |
@@ -3908,6 +3908,7 @@ void ParserTraits::ParseArrowFunctionFormalParameters( |
parser_->scope_->RemoveUnresolved(expr->AsVariableProxy()); |
} |
+ ++parameters->arity; |
ExpressionClassifier classifier; |
DeclareFormalParameter(parameters, expr, is_rest, &classifier); |
if (!duplicate_loc->IsValid()) { |
@@ -3996,7 +3997,7 @@ FunctionLiteral* Parser::ParseFunctionLiteral( |
: NewScope(scope_, FUNCTION_SCOPE, kind); |
scope->SetLanguageMode(language_mode); |
ZoneList<Statement*>* body = NULL; |
- int arity = 0; |
+ int arity = -1; |
int materialized_literal_count = -1; |
int expected_property_count = -1; |
DuplicateFinder duplicate_finder(scanner()->unicode_cache()); |
@@ -4030,7 +4031,9 @@ FunctionLiteral* Parser::ParseFunctionLiteral( |
int start_position = scanner()->location().beg_pos; |
scope_->set_start_position(start_position); |
ParserFormalParameters formals(scope); |
- arity = ParseFormalParameterList(&formals, &formals_classifier, CHECK_OK); |
+ ParseFormalParameterList(&formals, &formals_classifier, CHECK_OK); |
+ arity = formals.arity; |
+ DCHECK(arity == formals.params.length()); |
Expect(Token::RPAREN, CHECK_OK); |
int formals_end_position = scanner()->location().end_pos; |
@@ -4294,7 +4297,8 @@ Block* Parser::BuildParameterInitializationBlock( |
DCHECK(scope_->is_function_scope()); |
Block* init_block = |
factory()->NewBlock(NULL, 1, true, RelocInfo::kNoPosition); |
- for (auto parameter : parameters.params) { |
+ for (int i = 0; i < parameters.params.length(); ++i) { |
+ auto parameter = parameters.params[i]; |
if (parameter.pattern == nullptr) continue; |
DeclarationDescriptor descriptor; |
descriptor.declaration_kind = DeclarationDescriptor::PARAMETER; |
@@ -4309,7 +4313,7 @@ Block* Parser::BuildParameterInitializationBlock( |
descriptor.init_op = Token::INIT_LET; |
DeclarationParsingResult::Declaration decl( |
parameter.pattern, parameter.pattern->position(), |
- factory()->NewVariableProxy(parameter.var)); |
+ factory()->NewVariableProxy(parameters.scope->parameter(i))); |
PatternRewriter::DeclareAndInitializeVariables(init_block, &descriptor, |
&decl, nullptr, CHECK_OK); |
} |
@@ -4477,7 +4481,7 @@ PreParser::PreParseResult Parser::ParseLazyFunctionBodyWithPreParser( |
SET_ALLOW(harmony_sloppy_let); |
SET_ALLOW(harmony_unicode); |
SET_ALLOW(harmony_computed_property_names); |
- SET_ALLOW(harmony_rest_params); |
+ SET_ALLOW(harmony_rest_parameters); |
SET_ALLOW(harmony_spreadcalls); |
SET_ALLOW(harmony_destructuring); |
SET_ALLOW(harmony_spread_arrays); |