| Index: src/arm/builtins-arm.cc
|
| diff --git a/src/arm/builtins-arm.cc b/src/arm/builtins-arm.cc
|
| index 9ece9d9f0d0eda09cb3d461c3a793f1d8f9838d3..0a60ca359f0406f550516308e2e41f0f87c12c0f 100644
|
| --- a/src/arm/builtins-arm.cc
|
| +++ b/src/arm/builtins-arm.cc
|
| @@ -1425,6 +1425,7 @@ static void ArgumentAdaptorStackCheck(MacroAssembler* masm,
|
| // -- r0 : actual number of arguments
|
| // -- r1 : function (passed through to callee)
|
| // -- r2 : expected number of arguments
|
| + // -- r3 : new target (passed through to callee)
|
| // -----------------------------------
|
| // Check the stack for overflow. We are not trying to catch
|
| // interruptions (e.g. debug break and preemption) here, so the "real stack
|
| @@ -1705,14 +1706,12 @@ void Builtins::Generate_ArgumentsAdaptorTrampoline(MacroAssembler* masm) {
|
| // -- r0 : actual number of arguments
|
| // -- r1 : function (passed through to callee)
|
| // -- r2 : expected number of arguments
|
| + // -- r3 : new target (passed through to callee)
|
| // -----------------------------------
|
|
|
| - Label stack_overflow;
|
| - ArgumentAdaptorStackCheck(masm, &stack_overflow);
|
| - Label invoke, dont_adapt_arguments;
|
| + Label invoke, dont_adapt_arguments, stack_overflow;
|
|
|
| Label enough, too_few;
|
| - __ ldr(r3, FieldMemOperand(r1, JSFunction::kCodeEntryOffset));
|
| __ cmp(r0, r2);
|
| __ b(lt, &too_few);
|
| __ cmp(r2, Operand(SharedFunctionInfo::kDontAdaptArgumentsSentinel));
|
| @@ -1721,12 +1720,13 @@ void Builtins::Generate_ArgumentsAdaptorTrampoline(MacroAssembler* masm) {
|
| { // Enough parameters: actual >= expected
|
| __ bind(&enough);
|
| EnterArgumentsAdaptorFrame(masm);
|
| + ArgumentAdaptorStackCheck(masm, &stack_overflow);
|
|
|
| // Calculate copy start address into r0 and copy end address into r4.
|
| // r0: actual number of arguments as a smi
|
| // r1: function
|
| // r2: expected number of arguments
|
| - // r3: code entry to call
|
| + // r3: new target (passed through to callee)
|
| __ add(r0, fp, Operand::PointerOffsetFromSmiKey(r0));
|
| // adjust for return address and receiver
|
| __ add(r0, r0, Operand(2 * kPointerSize));
|
| @@ -1736,7 +1736,7 @@ void Builtins::Generate_ArgumentsAdaptorTrampoline(MacroAssembler* masm) {
|
| // r0: copy start address
|
| // r1: function
|
| // r2: expected number of arguments
|
| - // r3: code entry to call
|
| + // r3: new target (passed through to callee)
|
| // r4: copy end address
|
|
|
| Label copy;
|
| @@ -1774,19 +1774,20 @@ void Builtins::Generate_ArgumentsAdaptorTrampoline(MacroAssembler* masm) {
|
|
|
| __ bind(&no_strong_error);
|
| EnterArgumentsAdaptorFrame(masm);
|
| + ArgumentAdaptorStackCheck(masm, &stack_overflow);
|
|
|
| // Calculate copy start address into r0 and copy end address is fp.
|
| // r0: actual number of arguments as a smi
|
| // r1: function
|
| // r2: expected number of arguments
|
| - // r3: code entry to call
|
| + // r3: new target (passed through to callee)
|
| __ add(r0, fp, Operand::PointerOffsetFromSmiKey(r0));
|
|
|
| // Copy the arguments (including the receiver) to the new stack frame.
|
| // r0: copy start address
|
| // r1: function
|
| // r2: expected number of arguments
|
| - // r3: code entry to call
|
| + // r3: new target (passed through to callee)
|
| Label copy;
|
| __ bind(©);
|
| // Adjust load for return address and receiver.
|
| @@ -1799,7 +1800,7 @@ void Builtins::Generate_ArgumentsAdaptorTrampoline(MacroAssembler* masm) {
|
| // Fill the remaining expected arguments with undefined.
|
| // r1: function
|
| // r2: expected number of arguments
|
| - // r3: code entry to call
|
| + // r3: new target (passed through to callee)
|
| __ LoadRoot(ip, Heap::kUndefinedValueRootIndex);
|
| __ sub(r4, fp, Operand(r2, LSL, kPointerSizeLog2));
|
| // Adjust for frame.
|
| @@ -1818,7 +1819,9 @@ void Builtins::Generate_ArgumentsAdaptorTrampoline(MacroAssembler* masm) {
|
| __ mov(r0, r2);
|
| // r0 : expected number of arguments
|
| // r1 : function (passed through to callee)
|
| - __ Call(r3);
|
| + // r3 : new target (passed through to callee)
|
| + __ ldr(r4, FieldMemOperand(r1, JSFunction::kCodeEntryOffset));
|
| + __ Call(r4);
|
|
|
| // Store offset of return address for deoptimizer.
|
| masm->isolate()->heap()->SetArgumentsAdaptorDeoptPCOffset(masm->pc_offset());
|
| @@ -1832,12 +1835,12 @@ void Builtins::Generate_ArgumentsAdaptorTrampoline(MacroAssembler* masm) {
|
| // Dont adapt arguments.
|
| // -------------------------------------------
|
| __ bind(&dont_adapt_arguments);
|
| - __ Jump(r3);
|
| + __ ldr(r4, FieldMemOperand(r1, JSFunction::kCodeEntryOffset));
|
| + __ Jump(r4);
|
|
|
| __ bind(&stack_overflow);
|
| {
|
| FrameScope frame(masm, StackFrame::MANUAL);
|
| - EnterArgumentsAdaptorFrame(masm);
|
| __ CallRuntime(Runtime::kThrowStackOverflow, 0);
|
| __ bkpt(0);
|
| }
|
|
|