Index: src/arm/full-codegen-arm.cc |
diff --git a/src/arm/full-codegen-arm.cc b/src/arm/full-codegen-arm.cc |
index 06514910ac513324cdc0d5c281ffa3a9ddd8aaa8..8a500e203545c40954fe3e44c358e70c8da34bc7 100644 |
--- a/src/arm/full-codegen-arm.cc |
+++ b/src/arm/full-codegen-arm.cc |
@@ -144,15 +144,25 @@ void FullCodeGenerator::Generate() { |
} |
#endif |
- // Strict mode functions and builtins need to replace the receiver |
- // with undefined when called as functions (without an explicit |
- // receiver object). r5 is zero for method calls and non-zero for |
- // function calls. |
- if (!info->is_classic_mode() || info->is_native()) { |
+ // Classic mode functions and builtins need to replace the receiver with the |
+ // global proxy when called as functions (without an explicit receiver |
+ // object). |
+ if (info->is_classic_mode() && !info->is_native()) { |
+ Label ok; |
__ cmp(r5, Operand::Zero()); |
+ __ b(eq, &ok); |
+ |
int receiver_offset = info->scope()->num_parameters() * kPointerSize; |
- __ LoadRoot(r2, Heap::kUndefinedValueRootIndex); |
- __ str(r2, MemOperand(sp, receiver_offset), ne); |
+ __ ldr(r2, MemOperand(sp, receiver_offset)); |
+ __ CompareRoot(r2, Heap::kUndefinedValueRootIndex); |
+ __ b(ne, &ok); |
+ |
+ __ ldr(r2, GlobalObjectOperand()); |
+ __ ldr(r2, FieldMemOperand(r2, GlobalObject::kGlobalReceiverOffset)); |
+ |
+ __ str(r2, MemOperand(sp, receiver_offset)); |
+ |
+ __ bind(&ok); |
} |
// Open a frame scope to indicate that there is a frame on the stack. The |
@@ -2734,7 +2744,7 @@ void FullCodeGenerator::VisitCall(Call* expr) { |
// Record source position for debugger. |
SetSourcePosition(expr->position()); |
- CallFunctionStub stub(arg_count, RECEIVER_MIGHT_BE_IMPLICIT); |
+ CallFunctionStub stub(arg_count, NO_CALL_FUNCTION_FLAGS); |
__ ldr(r1, MemOperand(sp, (arg_count + 1) * kPointerSize)); |
__ CallStub(&stub); |
RecordJSReturnSite(expr); |
@@ -2776,15 +2786,14 @@ void FullCodeGenerator::VisitCall(Call* expr) { |
__ push(r0); |
// The receiver is implicitly the global receiver. Indicate this |
// by passing the hole to the call function stub. |
- __ LoadRoot(r1, Heap::kTheHoleValueRootIndex); |
+ __ LoadRoot(r1, Heap::kUndefinedValueRootIndex); |
__ push(r1); |
__ bind(&call); |
} |
// The receiver is either the global receiver or an object found |
- // by LoadContextSlot. That object could be the hole if the |
- // receiver is implicitly the global object. |
- EmitCallWithStub(expr, RECEIVER_MIGHT_BE_IMPLICIT); |
+ // by LoadContextSlot. |
+ EmitCallWithStub(expr, NO_CALL_FUNCTION_FLAGS); |
} else if (property != NULL) { |
{ PreservePositionScope scope(masm()->positions_recorder()); |
VisitForStackValue(property->obj()); |
@@ -2801,12 +2810,10 @@ void FullCodeGenerator::VisitCall(Call* expr) { |
{ PreservePositionScope scope(masm()->positions_recorder()); |
VisitForStackValue(callee); |
} |
- // Push the hole as receiver. |
- // It will be correctly replaced in the call stub. |
- __ LoadRoot(r1, Heap::kTheHoleValueRootIndex); |
+ __ LoadRoot(r1, Heap::kUndefinedValueRootIndex); |
__ push(r1); |
// Emit function call. |
- EmitCallWithStub(expr, RECEIVER_IS_IMPLICIT); |
+ EmitCallWithStub(expr, NO_CALL_FUNCTION_FLAGS); |
} |
#ifdef DEBUG |
@@ -3723,7 +3730,7 @@ void FullCodeGenerator::EmitCallFunction(CallRuntime* expr) { |
__ mov(r1, result_register()); |
ParameterCount count(arg_count); |
__ InvokeFunction(r1, count, CALL_FUNCTION, |
- NullCallWrapper(), CALL_AS_METHOD); |
+ NullCallWrapper(), CALL_AS_FUNCTION); |
__ ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); |
__ jmp(&done); |