| Index: src/parsing/parser.cc
|
| diff --git a/src/parsing/parser.cc b/src/parsing/parser.cc
|
| index cabede50d3c5c72ee205ec7f2f34f2e118408d52..f224dfe8b513c97b0c16f0f7cd74c28c4ca8dc80 100644
|
| --- a/src/parsing/parser.cc
|
| +++ b/src/parsing/parser.cc
|
| @@ -3754,24 +3754,28 @@ ZoneList<Expression*>* Parser::PrepareSpreadArguments(
|
| UNREACHABLE();
|
| }
|
|
|
| +namespace {
|
| +
|
| +bool OnlyLastArgIsSpread(ZoneList<Expression*>* args) {
|
| + for (int i = 0; i < args->length() - 1; i++) {
|
| + if (args->at(i)->IsSpread()) {
|
| + return false;
|
| + }
|
| + }
|
| + return args->at(args->length() - 1)->IsSpread();
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| Expression* Parser::SpreadCall(Expression* function,
|
| - ZoneList<Expression*>* args, int pos) {
|
| + ZoneList<Expression*>* args, int pos,
|
| + Call::PossiblyEval is_possibly_eval) {
|
| if (function->IsSuperCallReference()) {
|
| // Super calls
|
| // $super_constructor = %_GetSuperConstructor(<this-function>)
|
| // %reflect_construct($super_constructor, args, new.target)
|
|
|
| - bool only_last_arg_is_spread = false;
|
| - for (int i = 0; i < args->length(); i++) {
|
| - if (args->at(i)->IsSpread()) {
|
| - if (i == args->length() - 1) {
|
| - only_last_arg_is_spread = true;
|
| - }
|
| - break;
|
| - }
|
| - }
|
| -
|
| - if (only_last_arg_is_spread) {
|
| + if (OnlyLastArgIsSpread(args)) {
|
| // Handle in BytecodeGenerator.
|
| Expression* super_call_ref = NewSuperCallReference(pos);
|
| return factory()->NewCall(super_call_ref, args, pos);
|
| @@ -3786,6 +3790,11 @@ Expression* Parser::SpreadCall(Expression* function,
|
| return factory()->NewCallRuntime(Context::REFLECT_CONSTRUCT_INDEX, args,
|
| pos);
|
| } else {
|
| + if (OnlyLastArgIsSpread(args)) {
|
| + // Handle in BytecodeGenerator.
|
| + return factory()->NewCall(function, args, pos, is_possibly_eval);
|
| + }
|
| +
|
| args = PrepareSpreadArguments(args);
|
| if (function->IsProperty()) {
|
| // Method calls
|
|
|