| Index: src/arm/builtins-arm.cc
|
| diff --git a/src/arm/builtins-arm.cc b/src/arm/builtins-arm.cc
|
| index 6480a9162be3a47a9bee8af0e825f402b6f91788..c599c7ec65e1ebeccb871c155e4e7657a0bb1e52 100644
|
| --- a/src/arm/builtins-arm.cc
|
| +++ b/src/arm/builtins-arm.cc
|
| @@ -1187,71 +1187,18 @@ void Builtins::Generate_FunctionCall(MacroAssembler* masm) {
|
| __ CompareObjectType(r1, r2, r2, JS_FUNCTION_TYPE);
|
| __ b(ne, &non_function);
|
|
|
| - // 3a. Patch the first argument if necessary when calling a function.
|
| // r0: actual number of arguments
|
| // r1: function
|
| - Label shift_arguments;
|
| - { Label convert_to_object, use_global_receiver, patch_receiver;
|
| - // Change context eagerly in case we need the global receiver.
|
| - __ ldr(cp, FieldMemOperand(r1, JSFunction::kContextOffset));
|
| -
|
| - __ add(r2, sp, Operand(r0, LSL, kPointerSizeLog2));
|
| - __ ldr(r2, MemOperand(r2, -kPointerSize));
|
| - // r0: actual number of arguments
|
| - // r1: function
|
| - // r2: first argument
|
| - __ tst(r2, Operand(kSmiTagMask));
|
| - __ b(eq, &convert_to_object);
|
| -
|
| - __ LoadRoot(r3, Heap::kNullValueRootIndex);
|
| - __ cmp(r2, r3);
|
| - __ b(eq, &use_global_receiver);
|
| - __ LoadRoot(r3, Heap::kUndefinedValueRootIndex);
|
| - __ cmp(r2, r3);
|
| - __ b(eq, &use_global_receiver);
|
| -
|
| - __ CompareObjectType(r2, r3, r3, FIRST_JS_OBJECT_TYPE);
|
| - __ b(lt, &convert_to_object);
|
| - __ cmp(r3, Operand(LAST_JS_OBJECT_TYPE));
|
| - __ b(le, &shift_arguments);
|
| -
|
| - __ bind(&convert_to_object);
|
| - __ EnterInternalFrame(); // In order to preserve argument count.
|
| - __ mov(r0, Operand(r0, LSL, kSmiTagSize)); // Smi-tagged.
|
| - __ push(r0);
|
| + // Change context eagerly in case we need the global receiver.
|
| + __ ldr(cp, FieldMemOperand(r1, JSFunction::kContextOffset));
|
|
|
| - __ push(r2);
|
| - __ InvokeBuiltin(Builtins::TO_OBJECT, CALL_JS);
|
| - __ mov(r2, r0);
|
| -
|
| - __ pop(r0);
|
| - __ mov(r0, Operand(r0, ASR, kSmiTagSize));
|
| - __ LeaveInternalFrame();
|
| - // Restore the function to r1.
|
| - __ ldr(r1, MemOperand(sp, r0, LSL, kPointerSizeLog2));
|
| - __ 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;
|
| - __ ldr(r2, FieldMemOperand(cp, kGlobalIndex));
|
| - __ ldr(r2, FieldMemOperand(r2, GlobalObject::kGlobalContextOffset));
|
| - __ ldr(r2, FieldMemOperand(r2, kGlobalIndex));
|
| - __ ldr(r2, FieldMemOperand(r2, GlobalObject::kGlobalReceiverOffset));
|
| -
|
| - __ bind(&patch_receiver);
|
| - __ add(r3, sp, Operand(r0, LSL, kPointerSizeLog2));
|
| - __ str(r2, MemOperand(r3, -kPointerSize));
|
| -
|
| - __ jmp(&shift_arguments);
|
| - }
|
| + 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.
|
| // r0: actual number of arguments
|
| // r1: function
|
| __ bind(&non_function);
|
| @@ -1359,44 +1306,9 @@ void Builtins::Generate_FunctionApply(MacroAssembler* masm) {
|
| __ ldr(r0, MemOperand(fp, kFunctionOffset));
|
| __ ldr(cp, FieldMemOperand(r0, JSFunction::kContextOffset));
|
|
|
| - // Compute the receiver.
|
| - Label call_to_object, use_global_receiver, push_receiver;
|
| - __ ldr(r0, MemOperand(fp, kRecvOffset));
|
| - __ tst(r0, Operand(kSmiTagMask));
|
| - __ b(eq, &call_to_object);
|
| - __ LoadRoot(r1, Heap::kNullValueRootIndex);
|
| - __ cmp(r0, r1);
|
| - __ b(eq, &use_global_receiver);
|
| - __ LoadRoot(r1, Heap::kUndefinedValueRootIndex);
|
| - __ cmp(r0, r1);
|
| - __ b(eq, &use_global_receiver);
|
| -
|
| - // Check if the receiver is already a JavaScript object.
|
| - // r0: receiver
|
| - __ CompareObjectType(r0, r1, r1, FIRST_JS_OBJECT_TYPE);
|
| - __ b(lt, &call_to_object);
|
| - __ cmp(r1, Operand(LAST_JS_OBJECT_TYPE));
|
| - __ b(le, &push_receiver);
|
| -
|
| - // Convert the receiver to a regular object.
|
| - // r0: receiver
|
| - __ bind(&call_to_object);
|
| - __ push(r0);
|
| - __ InvokeBuiltin(Builtins::TO_OBJECT, CALL_JS);
|
| - __ b(&push_receiver);
|
| -
|
| - // Use the current global receiver object as the receiver.
|
| - __ bind(&use_global_receiver);
|
| - const int kGlobalOffset =
|
| - Context::kHeaderSize + Context::GLOBAL_INDEX * kPointerSize;
|
| - __ ldr(r0, FieldMemOperand(cp, kGlobalOffset));
|
| - __ ldr(r0, FieldMemOperand(r0, GlobalObject::kGlobalContextOffset));
|
| - __ ldr(r0, FieldMemOperand(r0, kGlobalOffset));
|
| - __ ldr(r0, FieldMemOperand(r0, GlobalObject::kGlobalReceiverOffset));
|
| -
|
| // Push the receiver.
|
| + __ ldr(r0, MemOperand(fp, kRecvOffset));
|
| // r0: receiver
|
| - __ bind(&push_receiver);
|
| __ push(r0);
|
|
|
| // Copy all arguments from the array to the stack.
|
|
|