| Index: src/mips/code-stubs-mips.cc
|
| diff --git a/src/mips/code-stubs-mips.cc b/src/mips/code-stubs-mips.cc
|
| index e9643ba84493aed4c3bf8713a456c9a3898a3756..d470feafa9207a1faf65e489ff5fa2d91b390e9e 100644
|
| --- a/src/mips/code-stubs-mips.cc
|
| +++ b/src/mips/code-stubs-mips.cc
|
| @@ -4655,34 +4655,22 @@ void RegExpConstructResultStub::Generate(MacroAssembler* masm) {
|
| void CallFunctionStub::Generate(MacroAssembler* masm) {
|
| Label slow;
|
|
|
| - // If the receiver might be a value (string, number or boolean) check
|
| - // for this and box it if it is.
|
| - if (ReceiverMightBeValue()) {
|
| + // The receiver might implicitly be the global object. This is
|
| + // indicated by passing the hole as the receiver to the call
|
| + // function stub.
|
| + if (ReceiverMightBeImplicit()) {
|
| + Label call;
|
| // Get the receiver from the stack.
|
| // function, receiver [, arguments]
|
| - Label receiver_is_value, receiver_is_js_object;
|
| - __ lw(a1, MemOperand(sp, argc_ * kPointerSize));
|
| -
|
| - // Check if receiver is a smi (which is a number value).
|
| - __ JumpIfSmi(a1, &receiver_is_value);
|
| -
|
| - // Check if the receiver is a valid JS object.
|
| - __ GetObjectType(a1, a2, a2);
|
| - __ Branch(&receiver_is_js_object,
|
| - ge,
|
| - a2,
|
| - Operand(FIRST_JS_OBJECT_TYPE));
|
| -
|
| - // Call the runtime to box the value.
|
| - __ bind(&receiver_is_value);
|
| - // We need natives to execute this.
|
| - __ EnterInternalFrame();
|
| - __ push(a1);
|
| - __ InvokeBuiltin(Builtins::TO_OBJECT, CALL_FUNCTION);
|
| - __ LeaveInternalFrame();
|
| - __ sw(v0, MemOperand(sp, argc_ * kPointerSize));
|
| -
|
| - __ bind(&receiver_is_js_object);
|
| + __ lw(t0, MemOperand(sp, argc_ * kPointerSize));
|
| + // Call as function is indicated with the hole.
|
| + __ LoadRoot(at, Heap::kTheHoleValueRootIndex);
|
| + __ Branch(&call, ne, t0, Operand(at));
|
| + // Patch the receiver on the stack with the global receiver object.
|
| + __ lw(a1, MemOperand(cp, Context::SlotOffset(Context::GLOBAL_INDEX)));
|
| + __ lw(a1, FieldMemOperand(a1, GlobalObject::kGlobalReceiverOffset));
|
| + __ sw(a1, MemOperand(sp, argc_ * kPointerSize));
|
| + __ bind(&call);
|
| }
|
|
|
| // Get the function to call from the stack.
|
| @@ -4699,7 +4687,19 @@ void CallFunctionStub::Generate(MacroAssembler* masm) {
|
| // Fast-case: Invoke the function now.
|
| // a1: pushed function
|
| ParameterCount actual(argc_);
|
| - __ InvokeFunction(a1, actual, JUMP_FUNCTION);
|
| +
|
| + if (ReceiverMightBeImplicit()) {
|
| + Label call_as_function;
|
| + __ LoadRoot(at, Heap::kTheHoleValueRootIndex);
|
| + __ Branch(&call_as_function, eq, t0, Operand(at));
|
| + __ InvokeFunction(a1, actual, JUMP_FUNCTION);
|
| + __ bind(&call_as_function);
|
| + }
|
| + __ InvokeFunction(a1,
|
| + actual,
|
| + JUMP_FUNCTION,
|
| + NullCallWrapper(),
|
| + CALL_AS_FUNCTION);
|
|
|
| // Slow-case: Non-function called.
|
| __ bind(&slow);
|
|
|