| Index: src/x64/builtins-x64.cc
|
| diff --git a/src/x64/builtins-x64.cc b/src/x64/builtins-x64.cc
|
| index d738261a1b84ad3240c52d2f64cb122864f6baa5..d301f04f1976e9fcba68ce344ed2e125e3c1df95 100644
|
| --- a/src/x64/builtins-x64.cc
|
| +++ b/src/x64/builtins-x64.cc
|
| @@ -610,62 +610,16 @@ void Builtins::Generate_FunctionCall(MacroAssembler* masm) {
|
| __ CmpObjectType(rdi, JS_FUNCTION_TYPE, rcx);
|
| __ j(not_equal, &non_function);
|
|
|
| - // 3a. Patch the first argument if necessary when calling a function.
|
| - Label shift_arguments;
|
| - { Label convert_to_object, use_global_receiver, patch_receiver;
|
| - // Change context eagerly in case we need the global receiver.
|
| - __ movq(rsi, FieldOperand(rdi, JSFunction::kContextOffset));
|
| -
|
| - __ movq(rbx, Operand(rsp, rax, times_pointer_size, 0));
|
| - __ JumpIfSmi(rbx, &convert_to_object);
|
| -
|
| - __ CompareRoot(rbx, Heap::kNullValueRootIndex);
|
| - __ j(equal, &use_global_receiver);
|
| - __ CompareRoot(rbx, Heap::kUndefinedValueRootIndex);
|
| - __ j(equal, &use_global_receiver);
|
| -
|
| - __ CmpObjectType(rbx, FIRST_JS_OBJECT_TYPE, rcx);
|
| - __ j(below, &convert_to_object);
|
| - __ CmpInstanceType(rcx, LAST_JS_OBJECT_TYPE);
|
| - __ j(below_equal, &shift_arguments);
|
| -
|
| - __ bind(&convert_to_object);
|
| - __ EnterInternalFrame(); // In order to preserve argument count.
|
| - __ Integer32ToSmi(rax, rax);
|
| - __ push(rax);
|
| -
|
| - __ push(rbx);
|
| - __ InvokeBuiltin(Builtins::TO_OBJECT, CALL_FUNCTION);
|
| - __ movq(rbx, rax);
|
| -
|
| - __ pop(rax);
|
| - __ SmiToInteger32(rax, rax);
|
| - __ LeaveInternalFrame();
|
| - // Restore the function to rdi.
|
| - __ movq(rdi, Operand(rsp, rax, times_pointer_size, 1 * kPointerSize));
|
| - __ jmp(&patch_receiver);
|
| -
|
| - // Use the global receiver object from the called function as the
|
| - // receiver.
|
| - __ bind(&use_global_receiver);
|
| - const int kGlobalIndex =
|
| - Context::kHeaderSize + Context::GLOBAL_INDEX * kPointerSize;
|
| - __ movq(rbx, FieldOperand(rsi, kGlobalIndex));
|
| - __ movq(rbx, FieldOperand(rbx, GlobalObject::kGlobalContextOffset));
|
| - __ movq(rbx, FieldOperand(rbx, kGlobalIndex));
|
| - __ movq(rbx, FieldOperand(rbx, GlobalObject::kGlobalReceiverOffset));
|
| -
|
| - __ bind(&patch_receiver);
|
| - __ movq(Operand(rsp, rax, times_pointer_size, 0), rbx);
|
| -
|
| - __ jmp(&shift_arguments);
|
| - }
|
| + // Change context eagerly in case we need the global receiver.
|
| + __ movq(rsi, FieldOperand(rdi, JSFunction::kContextOffset));
|
|
|
| + Label shift_arguments;
|
| + __ jmp(&shift_arguments);
|
|
|
| - // 3b. Patch the first argument when calling a non-function. The
|
| - // CALL_NON_FUNCTION builtin expects the non-function callee as
|
| - // receiver, so overwrite the first argument which will ultimately
|
| - // become the receiver.
|
| + // 3. Patch the first argument when calling a non-function. The
|
| + // CALL_NON_FUNCTION builtin expects the non-function callee as
|
| + // receiver, so overwrite the first argument which will ultimately
|
| + // become the receiver.
|
| __ bind(&non_function);
|
| __ movq(Operand(rsp, rax, times_pointer_size, 0), rdi);
|
| __ Set(rdi, 0);
|
| @@ -769,40 +723,8 @@ void Builtins::Generate_FunctionApply(MacroAssembler* masm) {
|
| __ movq(rdi, Operand(rbp, kFunctionOffset));
|
| __ movq(rsi, FieldOperand(rdi, JSFunction::kContextOffset));
|
|
|
| - // Compute the receiver.
|
| - Label call_to_object, use_global_receiver, push_receiver;
|
| - __ movq(rbx, Operand(rbp, kReceiverOffset));
|
| - __ JumpIfSmi(rbx, &call_to_object);
|
| - __ CompareRoot(rbx, Heap::kNullValueRootIndex);
|
| - __ j(equal, &use_global_receiver);
|
| - __ CompareRoot(rbx, Heap::kUndefinedValueRootIndex);
|
| - __ j(equal, &use_global_receiver);
|
| -
|
| - // If given receiver is already a JavaScript object then there's no
|
| - // reason for converting it.
|
| - __ CmpObjectType(rbx, FIRST_JS_OBJECT_TYPE, rcx);
|
| - __ j(below, &call_to_object);
|
| - __ CmpInstanceType(rcx, LAST_JS_OBJECT_TYPE);
|
| - __ j(below_equal, &push_receiver);
|
| -
|
| - // Convert the receiver to an object.
|
| - __ bind(&call_to_object);
|
| - __ push(rbx);
|
| - __ InvokeBuiltin(Builtins::TO_OBJECT, CALL_FUNCTION);
|
| - __ movq(rbx, rax);
|
| - __ jmp(&push_receiver);
|
| -
|
| - // Use the current global receiver object as the receiver.
|
| - __ bind(&use_global_receiver);
|
| - const int kGlobalOffset =
|
| - Context::kHeaderSize + Context::GLOBAL_INDEX * kPointerSize;
|
| - __ movq(rbx, FieldOperand(rsi, kGlobalOffset));
|
| - __ movq(rbx, FieldOperand(rbx, GlobalObject::kGlobalContextOffset));
|
| - __ movq(rbx, FieldOperand(rbx, kGlobalOffset));
|
| - __ movq(rbx, FieldOperand(rbx, GlobalObject::kGlobalReceiverOffset));
|
| -
|
| // Push the receiver.
|
| - __ bind(&push_receiver);
|
| + __ movq(rbx, Operand(rbp, kReceiverOffset));
|
| __ push(rbx);
|
|
|
| // Copy all arguments from the array to the stack.
|
|
|