Index: src/parser.cc |
diff --git a/src/parser.cc b/src/parser.cc |
index 816849748869720029796504e4d282dc6ca1bb2e..96c269546f755b6a706a4cc9d13b555453ad3d25 100644 |
--- a/src/parser.cc |
+++ b/src/parser.cc |
@@ -3759,9 +3759,9 @@ Handle<FixedArray> CompileTimeValue::GetElements(Handle<FixedArray> value) { |
} |
-void ParserTraits::DeclareArrowFunctionParameters( |
+void ParserTraits::ParseArrowFunctionFormalParameters( |
Scope* scope, Expression* expr, const Scanner::Location& params_loc, |
- Scanner::Location* duplicate_loc, bool* ok) { |
+ bool* has_rest, Scanner::Location* duplicate_loc, bool* ok) { |
if (scope->num_parameters() >= Code::kMaxArguments) { |
ReportMessageAt(params_loc, MessageTemplate::kMalformedArrowFunParamList); |
*ok = false; |
@@ -3769,15 +3769,18 @@ void ParserTraits::DeclareArrowFunctionParameters( |
} |
// ArrowFunctionFormals :: |
- // Binary(Token::COMMA, ArrowFunctionFormals, VariableProxy) |
+ // Binary(Token::COMMA, NonTailArrowFunctionFormals, Tail) |
+ // Tail |
+ // NonTailArrowFunctionFormals :: |
+ // Binary(Token::COMMA, NonTailArrowFunctionFormals, VariableProxy) |
+ // VariableProxy |
+ // Tail :: |
// VariableProxy |
+ // Spread(VariableProxy) |
// |
// As we need to visit the parameters in left-to-right order, we recurse on |
// the left-hand side of comma expressions. |
// |
- // Sadly, for the various malformed_arrow_function_parameter_list errors, we |
- // can't be more specific on the error message or on the location because we |
- // need to match the pre-parser's behavior. |
if (expr->IsBinaryOperation()) { |
BinaryOperation* binop = expr->AsBinaryOperation(); |
// The classifier has already run, so we know that the expression is a valid |
@@ -3785,13 +3788,21 @@ void ParserTraits::DeclareArrowFunctionParameters( |
DCHECK_EQ(binop->op(), Token::COMMA); |
Expression* left = binop->left(); |
Expression* right = binop->right(); |
- DeclareArrowFunctionParameters(scope, left, params_loc, duplicate_loc, ok); |
+ ParseArrowFunctionFormalParameters(scope, left, params_loc, has_rest, |
+ duplicate_loc, ok); |
if (!*ok) return; |
// LHS of comma expression should be unparenthesized. |
expr = right; |
} |
- // TODO(wingo): Support rest parameters. |
+ // Only the right-most expression may be a rest parameter. |
+ DCHECK(!*has_rest); |
+ |
+ if (expr->IsSpread()) { |
+ *has_rest = true; |
+ expr = expr->AsSpread()->expression(); |
+ } |
+ |
DCHECK(expr->IsVariableProxy()); |
DCHECK(!expr->AsVariableProxy()->is_this()); |
@@ -3804,17 +3815,11 @@ void ParserTraits::DeclareArrowFunctionParameters( |
// parse-time side-effect. |
parser_->scope_->RemoveUnresolved(expr->AsVariableProxy()); |
- bool is_rest = false; |
ExpressionClassifier classifier; |
- DeclareFormalParameter(scope, raw_name, &classifier, is_rest); |
- *duplicate_loc = classifier.duplicate_formal_parameter_error().location; |
-} |
- |
- |
-void ParserTraits::ParseArrowFunctionFormalParameters( |
- Scope* scope, Expression* params, const Scanner::Location& params_loc, |
- bool* is_rest, Scanner::Location* duplicate_loc, bool* ok) { |
- DeclareArrowFunctionParameters(scope, params, params_loc, duplicate_loc, ok); |
+ DeclareFormalParameter(scope, raw_name, &classifier, *has_rest); |
+ if (!duplicate_loc->IsValid()) { |
+ *duplicate_loc = classifier.duplicate_formal_parameter_error().location; |
+ } |
} |