| Index: src/interpreter/bytecode-generator.cc
|
| diff --git a/src/interpreter/bytecode-generator.cc b/src/interpreter/bytecode-generator.cc
|
| index 56fa636d303584532fb59a51b42064e0a4948bfb..05b7010ce70fb7a7aba66d7f490eb93fb5e54014 100644
|
| --- a/src/interpreter/bytecode-generator.cc
|
| +++ b/src/interpreter/bytecode-generator.cc
|
| @@ -2462,27 +2462,12 @@
|
| return VisitCallSuper(expr);
|
| }
|
|
|
| + Register callee = register_allocator()->NewRegister();
|
| // Grow the args list as we visit receiver / arguments to avoid allocating all
|
| // the registers up-front. Otherwise these registers are unavailable during
|
| // receiver / argument visiting and we can end up with memory leaks due to
|
| // registers keeping objects alive.
|
| - RegisterList args;
|
| - Register callee;
|
| - // The CallWithSpread bytecode takes all arguments in a register list so that
|
| - // it can easily call into a runtime function for its implementation. This
|
| - // will change once CallWithSpread has an implementation in ASM.
|
| - // TODO(petermarshall): Remove this special path when CallWithSpread is done.
|
| - if (expr->only_last_arg_is_spread()) {
|
| - args = register_allocator()->NewGrowableRegisterList();
|
| - callee = register_allocator()->GrowRegisterList(&args);
|
| - } else {
|
| - callee = register_allocator()->NewRegister();
|
| - args = register_allocator()->NewGrowableRegisterList();
|
| - }
|
| -
|
| - // TODO(petermarshall): We have a lot of call bytecodes that are very similar,
|
| - // see if we can reduce the number by adding a separate argument which
|
| - // specifies the call type (e.g., property, spread, tailcall, etc.).
|
| + RegisterList args = register_allocator()->NewGrowableRegisterList();
|
|
|
| // Prepare the callee and the receiver to the function call. This depends on
|
| // the semantics of the underlying call type.
|
| @@ -2491,7 +2476,7 @@
|
| case Call::KEYED_PROPERTY_CALL: {
|
| Property* property = callee_expr->AsProperty();
|
| VisitAndPushIntoRegisterList(property->obj(), &args);
|
| - VisitPropertyLoadForRegister(args.last_register(), property, callee);
|
| + VisitPropertyLoadForRegister(args[0], property, callee);
|
| break;
|
| }
|
| case Call::GLOBAL_CALL: {
|
| @@ -2552,11 +2537,7 @@
|
| // Evaluate all arguments to the function call and store in sequential args
|
| // registers.
|
| VisitArguments(expr->arguments(), &args);
|
| - // TODO(petermarshall): Check this for spread calls as well when
|
| - // CallWithSpread is done.
|
| - if (!expr->only_last_arg_is_spread()) {
|
| - CHECK_EQ(expr->arguments()->length() + 1, args.register_count());
|
| - }
|
| + CHECK_EQ(expr->arguments()->length() + 1, args.register_count());
|
|
|
| // Resolve callee for a potential direct eval call. This block will mutate the
|
| // callee value.
|
| @@ -2586,17 +2567,9 @@
|
|
|
| builder()->SetExpressionPosition(expr);
|
|
|
| - // When a call contains a spread, a Call AST node is only created if there is
|
| - // exactly one spread, and it is the last argument.
|
| - if (expr->only_last_arg_is_spread()) {
|
| - CHECK_EQ(expr->arguments()->length() + 2, args.register_count());
|
| - DCHECK_EQ(TailCallMode::kDisallow, expr->tail_call_mode());
|
| - builder()->CallWithSpread(args);
|
| - } else {
|
| - int const feedback_slot_index = feedback_index(expr->CallFeedbackICSlot());
|
| - builder()->Call(callee, args, feedback_slot_index, call_type,
|
| - expr->tail_call_mode());
|
| - }
|
| + int const feedback_slot_index = feedback_index(expr->CallFeedbackICSlot());
|
| + builder()->Call(callee, args, feedback_slot_index, call_type,
|
| + expr->tail_call_mode());
|
| }
|
|
|
| void BytecodeGenerator::VisitCallSuper(Call* expr) {
|
| @@ -2618,7 +2591,7 @@
|
|
|
| // When a super call contains a spread, a CallSuper AST node is only created
|
| // if there is exactly one spread, and it is the last argument.
|
| - if (expr->only_last_arg_is_spread()) {
|
| + if (!args->is_empty() && args->last()->IsSpread()) {
|
| // TODO(petermarshall): Collect type on the feedback slot.
|
| builder()->NewWithSpread(constructor, args_regs);
|
| } else {
|
| @@ -2639,18 +2612,12 @@
|
| RegisterList args = register_allocator()->NewGrowableRegisterList();
|
| VisitArguments(expr->arguments(), &args);
|
|
|
| + builder()->SetExpressionPosition(expr);
|
| // The accumulator holds new target which is the same as the
|
| // constructor for CallNew.
|
| - builder()->SetExpressionPosition(expr);
|
| - builder()->LoadAccumulatorWithRegister(constructor);
|
| -
|
| - if (expr->only_last_arg_is_spread()) {
|
| - // TODO(petermarshall): Collect type on the feedback slot.
|
| - builder()->NewWithSpread(constructor, args);
|
| - } else {
|
| - builder()->New(constructor, args,
|
| - feedback_index(expr->CallNewFeedbackSlot()));
|
| - }
|
| + builder()
|
| + ->LoadAccumulatorWithRegister(constructor)
|
| + .New(constructor, args, feedback_index(expr->CallNewFeedbackSlot()));
|
| }
|
|
|
| void BytecodeGenerator::VisitCallRuntime(CallRuntime* expr) {
|
|
|