| Index: src/ia32/code-stubs-ia32.cc
|
| diff --git a/src/ia32/code-stubs-ia32.cc b/src/ia32/code-stubs-ia32.cc
|
| index d42c0e4416e426407a60c866dedfb68d974f53c2..b5cf5cec5c1ac71ca6f14e4fed3f68e0d57fbd9b 100644
|
| --- a/src/ia32/code-stubs-ia32.cc
|
| +++ b/src/ia32/code-stubs-ia32.cc
|
| @@ -1159,6 +1159,31 @@ void ArgumentsAccessStub::GenerateNewStrict(MacroAssembler* masm) {
|
| }
|
|
|
|
|
| +void RestParamAccessStub::GenerateNew(MacroAssembler* masm) {
|
| + // esp[0] : return address
|
| + // esp[4] : index of rest parameter
|
| + // esp[8] : number of parameters
|
| + // esp[12] : receiver displacement
|
| +
|
| + // Check if the calling frame is an arguments adaptor frame.
|
| + Label runtime;
|
| + __ mov(edx, Operand(ebp, StandardFrameConstants::kCallerFPOffset));
|
| + __ mov(ecx, Operand(edx, StandardFrameConstants::kContextOffset));
|
| + __ cmp(ecx, Immediate(Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR)));
|
| + __ j(not_equal, &runtime);
|
| +
|
| + // Patch the arguments.length and the parameters pointer.
|
| + __ mov(ecx, Operand(edx, ArgumentsAdaptorFrameConstants::kLengthOffset));
|
| + __ mov(Operand(esp, 2 * kPointerSize), ecx);
|
| + __ lea(edx, Operand(edx, ecx, times_2,
|
| + StandardFrameConstants::kCallerSPOffset));
|
| + __ mov(Operand(esp, 3 * kPointerSize), edx);
|
| +
|
| + __ bind(&runtime);
|
| + __ TailCallRuntime(Runtime::kNewRestParam, 3, 1);
|
| +}
|
| +
|
| +
|
| void RegExpExecStub::Generate(MacroAssembler* masm) {
|
| // Just jump directly to runtime if native RegExp is not selected at compile
|
| // time or if regexp entry in generated code is turned off runtime switch or
|
|
|