| Index: src/arm64/code-stubs-arm64.cc
|
| diff --git a/src/arm64/code-stubs-arm64.cc b/src/arm64/code-stubs-arm64.cc
|
| index 78c3ece058f19afbeaac9a9ee4e0f51d6d1d291f..d9ce8ef7169794d46ab2086f0a750a766405b5c6 100644
|
| --- a/src/arm64/code-stubs-arm64.cc
|
| +++ b/src/arm64/code-stubs-arm64.cc
|
| @@ -5076,17 +5076,34 @@ void FastNewSloppyArgumentsStub::Generate(MacroAssembler* masm) {
|
| // -----------------------------------
|
| __ AssertFunction(x1);
|
|
|
| + // For Ignition we need to skip all possible handler/stub frames until
|
| + // we reach the JavaScript frame for the function (similar to what the
|
| + // runtime fallback implementation does). So make x6 point to that
|
| + // JavaScript frame.
|
| + {
|
| + Label loop, loop_entry;
|
| + __ Mov(x6, fp);
|
| + __ B(&loop_entry);
|
| + __ Bind(&loop);
|
| + __ Ldr(x6, MemOperand(x6, StandardFrameConstants::kCallerFPOffset));
|
| + __ Bind(&loop_entry);
|
| + __ Ldr(x3, MemOperand(x6, StandardFrameConstants::kFunctionOffset));
|
| + __ Cmp(x3, x1);
|
| + __ B(ne, &loop);
|
| + }
|
| +
|
| // TODO(bmeurer): Cleanup to match the FastNewStrictArgumentsStub.
|
| __ Ldr(x2, FieldMemOperand(x1, JSFunction::kSharedFunctionInfoOffset));
|
| __ Ldrsw(
|
| x2, FieldMemOperand(x2, SharedFunctionInfo::kFormalParameterCountOffset));
|
| - __ Add(x3, fp, Operand(x2, LSL, kPointerSizeLog2));
|
| + __ Add(x3, x6, Operand(x2, LSL, kPointerSizeLog2));
|
| __ Add(x3, x3, Operand(StandardFrameConstants::kCallerSPOffset));
|
| __ SmiTag(x2);
|
|
|
| // x1 : function
|
| // x2 : number of parameters (tagged)
|
| // x3 : parameters pointer
|
| + // x6 : JavaScript frame pointer
|
| //
|
| // Returns pointer to result object in x0.
|
|
|
| @@ -5104,7 +5121,7 @@ void FastNewSloppyArgumentsStub::Generate(MacroAssembler* masm) {
|
| Register caller_ctx = x12;
|
| Label runtime;
|
| Label adaptor_frame, try_allocate;
|
| - __ Ldr(caller_fp, MemOperand(fp, StandardFrameConstants::kCallerFPOffset));
|
| + __ Ldr(caller_fp, MemOperand(x6, StandardFrameConstants::kCallerFPOffset));
|
| __ Ldr(
|
| caller_ctx,
|
| MemOperand(caller_fp, CommonFrameConstants::kContextOrFrameTypeOffset));
|
|
|