| Index: src/mips64/code-stubs-mips64.cc | 
| diff --git a/src/mips64/code-stubs-mips64.cc b/src/mips64/code-stubs-mips64.cc | 
| index efb1fd17df696cb387dac989639de554d209e561..454d6fb4d57c0819eb7246313e9751cc5cc0e8c6 100644 | 
| --- a/src/mips64/code-stubs-mips64.cc | 
| +++ b/src/mips64/code-stubs-mips64.cc | 
| @@ -997,6 +997,7 @@ void CodeStub::GenerateStubsAheadOfTime(Isolate* isolate) { | 
| StubFailureTrampolineStub::GenerateAheadOfTime(isolate); | 
| ArrayConstructorStubBase::GenerateStubsAheadOfTime(isolate); | 
| CreateAllocationSiteStub::GenerateAheadOfTime(isolate); | 
| +  CreateWeakCellStub::GenerateAheadOfTime(isolate); | 
| BinaryOpICStub::GenerateAheadOfTime(isolate); | 
| StoreRegistersStateStub::GenerateAheadOfTime(isolate); | 
| RestoreRegistersStateStub::GenerateAheadOfTime(isolate); | 
| @@ -2872,7 +2873,27 @@ void CallICStub::Generate(MacroAssembler* masm) { | 
| __ dsrl(a4, a3, 32 - kPointerSizeLog2); | 
| __ Daddu(a4, a2, Operand(a4)); | 
| __ ld(a4, FieldMemOperand(a4, FixedArray::kHeaderSize)); | 
| -  __ Branch(&extra_checks_or_miss, ne, a1, Operand(a4)); | 
| + | 
| +  // We don't know that we have a weak cell. We might have a private symbol | 
| +  // or an AllocationSite, but the memory is safe to examine. | 
| +  // AllocationSite::kTransitionInfoOffset - contains a Smi or pointer to | 
| +  // FixedArray. | 
| +  // WeakCell::kValueOffset - contains a JSFunction or Smi(0) | 
| +  // Symbol::kHashFieldSlot - if the low bit is 1, then the hash is not | 
| +  // computed, meaning that it can't appear to be a pointer. If the low bit is | 
| +  // 0, then hash is computed, but the 0 bit prevents the field from appearing | 
| +  // to be a pointer. | 
| +  STATIC_ASSERT(WeakCell::kSize >= kPointerSize); | 
| +  STATIC_ASSERT(AllocationSite::kTransitionInfoOffset == | 
| +                    WeakCell::kValueOffset && | 
| +                WeakCell::kValueOffset == Symbol::kHashFieldSlot); | 
| + | 
| +  __ ld(a5, FieldMemOperand(a4, WeakCell::kValueOffset)); | 
| +  __ Branch(&extra_checks_or_miss, ne, a1, Operand(a5)); | 
| + | 
| +  // The compare above could have been a SMI/SMI comparison. Guard against this | 
| +  // convincing us that we have a monomorphic JSFunction. | 
| +  __ JumpIfSmi(a1, &extra_checks_or_miss); | 
|  | 
| __ bind(&have_js_function); | 
| if (CallAsMethod()) { | 
| @@ -2949,16 +2970,18 @@ void CallICStub::Generate(MacroAssembler* masm) { | 
| __ Daddu(a4, a4, Operand(Smi::FromInt(1))); | 
| __ sd(a4, FieldMemOperand(a2, with_types_offset)); | 
|  | 
| -  // Store the function. | 
| -  __ dsrl(a4, a3, 32 - kPointerSizeLog2); | 
| -  __ Daddu(a4, a2, Operand(a4)); | 
| -  __ Daddu(a4, a4, Operand(FixedArray::kHeaderSize - kHeapObjectTag)); | 
| -  __ sd(a1, MemOperand(a4, 0)); | 
| +  // Store the function. Use a stub since we need a frame for allocation. | 
| +  // a2 - vector | 
| +  // a3 - slot | 
| +  // a1 - function | 
| +  { | 
| +    FrameScope scope(masm, StackFrame::INTERNAL); | 
| +    CreateWeakCellStub create_stub(masm->isolate()); | 
| +    __ Push(a1); | 
| +    __ CallStub(&create_stub); | 
| +    __ Pop(a1); | 
| +  } | 
|  | 
| -  // Update the write barrier. | 
| -  __ mov(a5, a1); | 
| -  __ RecordWrite(a2, a4, a5, kRAHasNotBeenSaved, kDontSaveFPRegs, | 
| -                 EMIT_REMEMBERED_SET, OMIT_SMI_CHECK); | 
| __ Branch(&have_js_function); | 
|  | 
| // We are here because tracing is on or we encountered a MISS case we can't | 
|  |