| Index: src/x87/builtins-x87.cc
|
| diff --git a/src/x87/builtins-x87.cc b/src/x87/builtins-x87.cc
|
| old mode 100644
|
| new mode 100755
|
| index f23110c67c9d59d793013c64c5ad29e9443196ba..d5d5274aa12749b9c60d81e56ef897f22db07b68
|
| --- a/src/x87/builtins-x87.cc
|
| +++ b/src/x87/builtins-x87.cc
|
| @@ -995,53 +995,7 @@ void Builtins::Generate_NotifyLazyDeoptimized(MacroAssembler* masm) {
|
|
|
|
|
| // static
|
| -void Builtins::Generate_FunctionCall(MacroAssembler* masm) {
|
| - // Stack Layout:
|
| - // esp[0] : Return address
|
| - // esp[8] : Argument n
|
| - // esp[16] : Argument n-1
|
| - // ...
|
| - // esp[8 * n] : Argument 1
|
| - // esp[8 * (n + 1)] : Receiver (callable to call)
|
| - //
|
| - // eax contains the number of arguments, n, not counting the receiver.
|
| - //
|
| - // 1. Make sure we have at least one argument.
|
| - {
|
| - Label done;
|
| - __ test(eax, eax);
|
| - __ j(not_zero, &done, Label::kNear);
|
| - __ PopReturnAddressTo(ebx);
|
| - __ PushRoot(Heap::kUndefinedValueRootIndex);
|
| - __ PushReturnAddressFrom(ebx);
|
| - __ inc(eax);
|
| - __ bind(&done);
|
| - }
|
| -
|
| - // 2. Get the callable to call (passed as receiver) from the stack.
|
| - __ mov(edi, Operand(esp, eax, times_pointer_size, kPointerSize));
|
| -
|
| - // 3. Shift arguments and return address one slot down on the stack
|
| - // (overwriting the original receiver). Adjust argument count to make
|
| - // the original first argument the new receiver.
|
| - {
|
| - Label loop;
|
| - __ mov(ecx, eax);
|
| - __ bind(&loop);
|
| - __ mov(ebx, Operand(esp, ecx, times_pointer_size, 0));
|
| - __ mov(Operand(esp, ecx, times_pointer_size, kPointerSize), ebx);
|
| - __ dec(ecx);
|
| - __ j(not_sign, &loop); // While non-negative (to copy return address).
|
| - __ pop(ebx); // Discard copy of return address.
|
| - __ dec(eax); // One fewer argument (first argument is new receiver).
|
| - }
|
| -
|
| - // 4. Call the callable.
|
| - __ Jump(masm->isolate()->builtins()->Call(), RelocInfo::CODE_TARGET);
|
| -}
|
| -
|
| -
|
| -void Builtins::Generate_FunctionApply(MacroAssembler* masm) {
|
| +void Builtins::Generate_FunctionPrototypeApply(MacroAssembler* masm) {
|
| // ----------- S t a t e -------------
|
| // -- eax : argc
|
| // -- esp[0] : return address
|
| @@ -1117,6 +1071,53 @@ void Builtins::Generate_FunctionApply(MacroAssembler* masm) {
|
| }
|
|
|
|
|
| +// static
|
| +void Builtins::Generate_FunctionPrototypeCall(MacroAssembler* masm) {
|
| + // Stack Layout:
|
| + // esp[0] : Return address
|
| + // esp[8] : Argument n
|
| + // esp[16] : Argument n-1
|
| + // ...
|
| + // esp[8 * n] : Argument 1
|
| + // esp[8 * (n + 1)] : Receiver (callable to call)
|
| + //
|
| + // eax contains the number of arguments, n, not counting the receiver.
|
| + //
|
| + // 1. Make sure we have at least one argument.
|
| + {
|
| + Label done;
|
| + __ test(eax, eax);
|
| + __ j(not_zero, &done, Label::kNear);
|
| + __ PopReturnAddressTo(ebx);
|
| + __ PushRoot(Heap::kUndefinedValueRootIndex);
|
| + __ PushReturnAddressFrom(ebx);
|
| + __ inc(eax);
|
| + __ bind(&done);
|
| + }
|
| +
|
| + // 2. Get the callable to call (passed as receiver) from the stack.
|
| + __ mov(edi, Operand(esp, eax, times_pointer_size, kPointerSize));
|
| +
|
| + // 3. Shift arguments and return address one slot down on the stack
|
| + // (overwriting the original receiver). Adjust argument count to make
|
| + // the original first argument the new receiver.
|
| + {
|
| + Label loop;
|
| + __ mov(ecx, eax);
|
| + __ bind(&loop);
|
| + __ mov(ebx, Operand(esp, ecx, times_pointer_size, 0));
|
| + __ mov(Operand(esp, ecx, times_pointer_size, kPointerSize), ebx);
|
| + __ dec(ecx);
|
| + __ j(not_sign, &loop); // While non-negative (to copy return address).
|
| + __ pop(ebx); // Discard copy of return address.
|
| + __ dec(eax); // One fewer argument (first argument is new receiver).
|
| + }
|
| +
|
| + // 4. Call the callable.
|
| + __ Jump(masm->isolate()->builtins()->Call(), RelocInfo::CODE_TARGET);
|
| +}
|
| +
|
| +
|
| void Builtins::Generate_ReflectApply(MacroAssembler* masm) {
|
| // ----------- S t a t e -------------
|
| // -- eax : argc
|
|
|