Index: src/builtins/ppc/builtins-ppc.cc |
diff --git a/src/builtins/ppc/builtins-ppc.cc b/src/builtins/ppc/builtins-ppc.cc |
index 5deb707f9f9d4ab2f5a0c68a305d32d9fff28806..93eedea746481bea9dab79ab8bb80465f531117b 100644 |
--- a/src/builtins/ppc/builtins-ppc.cc |
+++ b/src/builtins/ppc/builtins-ppc.cc |
@@ -1097,11 +1097,7 @@ static void Generate_StackOverflowCheck(MacroAssembler* masm, Register num_args, |
static void Generate_InterpreterPushArgs(MacroAssembler* masm, |
Register num_args, Register index, |
- Register count, Register scratch, |
- Label* stack_overflow) { |
- // A stack check before pushing arguments. |
- Generate_StackOverflowCheck(masm, num_args, scratch, stack_overflow); |
- |
+ Register count, Register scratch) { |
Label loop; |
__ addi(index, index, Operand(kPointerSize)); // Bias up for LoadPU |
__ mtctr(count); |
@@ -1113,8 +1109,8 @@ static void Generate_InterpreterPushArgs(MacroAssembler* masm, |
// static |
void Builtins::Generate_InterpreterPushArgsThenCallImpl( |
- MacroAssembler* masm, TailCallMode tail_call_mode, |
- InterpreterPushArgsMode mode) { |
+ MacroAssembler* masm, ConvertReceiverMode receiver_mode, |
+ TailCallMode tail_call_mode, InterpreterPushArgsMode mode) { |
// ----------- S t a t e ------------- |
// -- r3 : the number of arguments (not including the receiver) |
// -- r5 : the address of the first argument to be pushed. Subsequent |
@@ -1127,8 +1123,16 @@ void Builtins::Generate_InterpreterPushArgsThenCallImpl( |
// Calculate number of arguments (add one for receiver). |
__ addi(r6, r3, Operand(1)); |
+ Generate_StackOverflowCheck(masm, r6, ip, &stack_overflow); |
+ |
+ // Push "undefined" as the receiver arg if we need to. |
+ if (receiver_mode == ConvertReceiverMode::kNullOrUndefined) { |
+ __ PushRoot(Heap::kUndefinedValueRootIndex); |
+ __ mr(r6, r3); // Argument count is correct. |
+ } |
+ |
// Push the arguments. r5, r6, r7 will be modified. |
- Generate_InterpreterPushArgs(masm, r6, r5, r6, r7, &stack_overflow); |
+ Generate_InterpreterPushArgs(masm, r6, r5, r6, r7); |
// Call the target. |
if (mode == InterpreterPushArgsMode::kJSFunction) { |
@@ -1172,8 +1176,9 @@ void Builtins::Generate_InterpreterPushArgsThenConstructImpl( |
Label skip; |
__ cmpi(r3, Operand::Zero()); |
__ beq(&skip); |
+ Generate_StackOverflowCheck(masm, r3, ip, &stack_overflow); |
// Push the arguments. r8, r7, r9 will be modified. |
- Generate_InterpreterPushArgs(masm, r3, r7, r3, r8, &stack_overflow); |
+ Generate_InterpreterPushArgs(masm, r3, r7, r3, r9); |
__ bind(&skip); |
__ AssertUndefinedOrAllocationSite(r5, r8); |
@@ -1216,10 +1221,14 @@ void Builtins::Generate_InterpreterPushArgsThenConstructArray( |
// ----------------------------------- |
Label stack_overflow; |
- __ addi(r7, r3, Operand(1)); // Add one for receiver. |
+ // Push a slot for the receiver to be constructed. |
+ __ li(r0, Operand::Zero()); |
+ __ push(r0); |
+ |
+ Generate_StackOverflowCheck(masm, r3, ip, &stack_overflow); |
// Push the arguments. r6, r8, r3 will be modified. |
- Generate_InterpreterPushArgs(masm, r7, r6, r7, r8, &stack_overflow); |
+ Generate_InterpreterPushArgs(masm, r3, r6, r3, r8); |
// Array constructor expects constructor in r6. It is same as r4 here. |
__ mr(r6, r4); |