| Index: src/x64/code-stubs-x64.cc
|
| diff --git a/src/x64/code-stubs-x64.cc b/src/x64/code-stubs-x64.cc
|
| index 1413eff5cb641b620e593f439c29e677b5d3ce43..23c43e359baf1c009f151a36d7e45c63070f649e 100644
|
| --- a/src/x64/code-stubs-x64.cc
|
| +++ b/src/x64/code-stubs-x64.cc
|
| @@ -845,6 +845,33 @@ void ArgumentsAccessStub::GenerateNewSloppySlow(MacroAssembler* masm) {
|
| }
|
|
|
|
|
| +void RestParamAccessStub::GenerateNew(MacroAssembler* masm) {
|
| + // rsp[0] : return address
|
| + // rsp[8] : index of rest parameter
|
| + // rsp[16] : number of parameters
|
| + // rsp[24] : receiver displacement
|
| +
|
| + // Check if the calling frame is an arguments adaptor frame.
|
| + Label runtime;
|
| + __ movp(rdx, Operand(rbp, StandardFrameConstants::kCallerFPOffset));
|
| + __ movp(rcx, Operand(rdx, StandardFrameConstants::kContextOffset));
|
| + __ Cmp(rcx, Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR));
|
| + __ j(not_equal, &runtime);
|
| +
|
| + // Patch the arguments.length and the parameters pointer.
|
| + StackArgumentsAccessor args(rsp, 3, ARGUMENTS_DONT_CONTAIN_RECEIVER);
|
| + __ movp(rcx, Operand(rdx, ArgumentsAdaptorFrameConstants::kLengthOffset));
|
| + __ movp(args.GetArgumentOperand(1), rcx);
|
| + __ SmiToInteger64(rcx, rcx);
|
| + __ leap(rdx, Operand(rdx, rcx, times_pointer_size,
|
| + StandardFrameConstants::kCallerSPOffset));
|
| + __ movp(args.GetArgumentOperand(0), rdx);
|
| +
|
| + __ bind(&runtime);
|
| + __ TailCallRuntime(Runtime::kNewRestParam, 3, 1);
|
| +}
|
| +
|
| +
|
| void LoadIndexedInterceptorStub::Generate(MacroAssembler* masm) {
|
| // Return address is on the stack.
|
| Label slow;
|
|
|