| Index: src/x64/full-codegen-x64.cc | 
| diff --git a/src/x64/full-codegen-x64.cc b/src/x64/full-codegen-x64.cc | 
| index d5a220f9e3a2c626e68ef12edee60eea05a53e85..833394eae63bd7cccbcc3c7a65c520c29449300e 100644 | 
| --- a/src/x64/full-codegen-x64.cc | 
| +++ b/src/x64/full-codegen-x64.cc | 
| @@ -130,6 +130,22 @@ void FullCodeGenerator::Generate(CompilationInfo* info) { | 
| __ int3(); | 
| } | 
| #endif | 
| + | 
| +  // Strict mode functions need to replace the receiver with undefined | 
| +  // when called as functions (without an explicit receiver | 
| +  // object). rcx is zero for method calls and non-zero for function | 
| +  // calls. | 
| +  if (info->is_strict_mode()) { | 
| +    Label ok; | 
| +    __ testq(rcx, rcx); | 
| +    __ j(zero, &ok, Label::kNear); | 
| +    // +1 for return address. | 
| +    int receiver_offset = (scope()->num_parameters() + 1) * kPointerSize; | 
| +    __ LoadRoot(kScratchRegister, Heap::kUndefinedValueRootIndex); | 
| +    __ movq(Operand(rsp, receiver_offset), kScratchRegister); | 
| +    __ bind(&ok); | 
| +  } | 
| + | 
| __ push(rbp);  // Caller's frame pointer. | 
| __ movq(rbp, rsp); | 
| __ push(rsi);  // Callee's context. | 
| @@ -2001,7 +2017,7 @@ void FullCodeGenerator::EmitCallWithIC(Call* expr, | 
| // Call the IC initialization code. | 
| InLoopFlag in_loop = (loop_depth() > 0) ? IN_LOOP : NOT_IN_LOOP; | 
| Handle<Code> ic = | 
| -      ISOLATE->stub_cache()->ComputeCallInitialize(arg_count, in_loop); | 
| +      ISOLATE->stub_cache()->ComputeCallInitialize(arg_count, in_loop, mode); | 
| EmitCallIC(ic, mode, expr->id()); | 
| RecordJSReturnSite(expr); | 
| // Restore context register. | 
| @@ -2011,8 +2027,7 @@ void FullCodeGenerator::EmitCallWithIC(Call* expr, | 
|  | 
|  | 
| void FullCodeGenerator::EmitKeyedCallWithIC(Call* expr, | 
| -                                            Expression* key, | 
| -                                            RelocInfo::Mode mode) { | 
| +                                            Expression* key) { | 
| // Load the key. | 
| VisitForAccumulatorValue(key); | 
|  | 
| @@ -2037,7 +2052,7 @@ void FullCodeGenerator::EmitKeyedCallWithIC(Call* expr, | 
| Handle<Code> ic = | 
| ISOLATE->stub_cache()->ComputeKeyedCallInitialize(arg_count, in_loop); | 
| __ movq(rcx, Operand(rsp, (arg_count + 1) * kPointerSize));  // Key. | 
| -  EmitCallIC(ic, mode, expr->id()); | 
| +  EmitCallIC(ic, RelocInfo::CODE_TARGET, expr->id()); | 
| RecordJSReturnSite(expr); | 
| // Restore context register. | 
| __ movq(rsi, Operand(rbp, StandardFrameConstants::kContextOffset)); | 
| @@ -2148,7 +2163,7 @@ void FullCodeGenerator::VisitCall(Call* expr) { | 
| // Record source position for debugger. | 
| SetSourcePosition(expr->position()); | 
| InLoopFlag in_loop = (loop_depth() > 0) ? IN_LOOP : NOT_IN_LOOP; | 
| -    CallFunctionStub stub(arg_count, in_loop, RECEIVER_MIGHT_BE_VALUE); | 
| +    CallFunctionStub stub(arg_count, in_loop, RECEIVER_MIGHT_BE_IMPLICIT); | 
| __ CallStub(&stub); | 
| RecordJSReturnSite(expr); | 
| // Restore context register. | 
| @@ -2197,9 +2212,10 @@ void FullCodeGenerator::VisitCall(Call* expr) { | 
| __ bind(&call); | 
| } | 
|  | 
| -    // The receiver is either the global receiver or a JSObject found by | 
| -    // LoadContextSlot. | 
| -    EmitCallWithStub(expr, NO_CALL_FUNCTION_FLAGS); | 
| +    // 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); | 
| } else if (fun->AsProperty() != NULL) { | 
| // Call to an object property. | 
| Property* prop = fun->AsProperty(); | 
| @@ -2242,7 +2258,7 @@ void FullCodeGenerator::VisitCall(Call* expr) { | 
| { PreservePositionScope scope(masm()->positions_recorder()); | 
| VisitForStackValue(prop->obj()); | 
| } | 
| -        EmitKeyedCallWithIC(expr, prop->key(), RelocInfo::CODE_TARGET); | 
| +        EmitKeyedCallWithIC(expr, prop->key()); | 
| } | 
| } | 
| } else { | 
| @@ -3589,9 +3605,10 @@ void FullCodeGenerator::VisitCallRuntime(CallRuntime* expr) { | 
| // Call the JS runtime function using a call IC. | 
| __ Move(rcx, expr->name()); | 
| InLoopFlag in_loop = (loop_depth() > 0) ? IN_LOOP : NOT_IN_LOOP; | 
| +    RelocInfo::Mode mode = RelocInfo::CODE_TARGET; | 
| Handle<Code> ic = | 
| -        ISOLATE->stub_cache()->ComputeCallInitialize(arg_count, in_loop); | 
| -    EmitCallIC(ic, RelocInfo::CODE_TARGET, expr->id()); | 
| +        ISOLATE->stub_cache()->ComputeCallInitialize(arg_count, in_loop, mode); | 
| +    EmitCallIC(ic, mode, expr->id()); | 
| // Restore context register. | 
| __ movq(rsi, Operand(rbp, StandardFrameConstants::kContextOffset)); | 
| } else { | 
|  |