| Index: src/heap/heap.cc
 | 
| diff --git a/src/heap/heap.cc b/src/heap/heap.cc
 | 
| index 5806ce10161a83f50a92502d438bd0a2f64fb321..8161056681a97066c8a9c27f8bacebc1df319273 100644
 | 
| --- a/src/heap/heap.cc
 | 
| +++ b/src/heap/heap.cc
 | 
| @@ -1469,38 +1469,6 @@ void Heap::MarkCompactPrologue() {
 | 
|  }
 | 
|  
 | 
|  
 | 
| -#ifdef VERIFY_HEAP
 | 
| -// Visitor class to verify pointers in code or data space do not point into
 | 
| -// new space.
 | 
| -class VerifyNonPointerSpacePointersVisitor : public ObjectVisitor {
 | 
| - public:
 | 
| -  explicit VerifyNonPointerSpacePointersVisitor(Heap* heap) : heap_(heap) {}
 | 
| -
 | 
| -  void VisitPointers(Object** start, Object** end) override {
 | 
| -    for (Object** current = start; current < end; current++) {
 | 
| -      if ((*current)->IsHeapObject()) {
 | 
| -        CHECK(!heap_->InNewSpace(HeapObject::cast(*current)));
 | 
| -      }
 | 
| -    }
 | 
| -  }
 | 
| -
 | 
| - private:
 | 
| -  Heap* heap_;
 | 
| -};
 | 
| -
 | 
| -
 | 
| -static void VerifyNonPointerSpacePointers(Heap* heap) {
 | 
| -  // Verify that there are no pointers to new space in spaces where we
 | 
| -  // do not expect them.
 | 
| -  VerifyNonPointerSpacePointersVisitor v(heap);
 | 
| -  HeapObjectIterator code_it(heap->code_space());
 | 
| -  for (HeapObject* object = code_it.Next(); object != NULL;
 | 
| -       object = code_it.Next())
 | 
| -    object->Iterate(&v);
 | 
| -}
 | 
| -#endif  // VERIFY_HEAP
 | 
| -
 | 
| -
 | 
|  void Heap::CheckNewSpaceExpansionCriteria() {
 | 
|    if (FLAG_experimental_new_space_growth_heuristic) {
 | 
|      if (new_space_.TotalCapacity() < new_space_.MaximumCapacity() &&
 | 
| @@ -1613,10 +1581,6 @@ void Heap::Scavenge() {
 | 
|  
 | 
|    mark_compact_collector()->sweeper().EnsureNewSpaceCompleted();
 | 
|  
 | 
| -#ifdef VERIFY_HEAP
 | 
| -  if (FLAG_verify_heap) VerifyNonPointerSpacePointers(this);
 | 
| -#endif
 | 
| -
 | 
|    gc_state_ = SCAVENGE;
 | 
|  
 | 
|    // Implements Cheney's copying algorithm
 | 
| @@ -2859,6 +2823,10 @@ void Heap::CreateInitialObjects() {
 | 
|        *WeakHashTable::New(isolate(), 16, USE_DEFAULT_MINIMUM_CAPACITY,
 | 
|                            TENURED));
 | 
|  
 | 
| +  set_weak_new_space_object_to_code_list(
 | 
| +      ArrayList::cast(*(factory->NewFixedArray(16, TENURED))));
 | 
| +  weak_new_space_object_to_code_list()->SetLength(0);
 | 
| +
 | 
|    set_script_list(Smi::FromInt(0));
 | 
|  
 | 
|    Handle<SeededNumberDictionary> slow_element_dictionary =
 | 
| @@ -2918,7 +2886,6 @@ void Heap::CreateInitialObjects() {
 | 
|    CreateFixedStubs();
 | 
|  }
 | 
|  
 | 
| -
 | 
|  bool Heap::RootCanBeWrittenAfterInitialization(Heap::RootListIndex root_index) {
 | 
|    switch (root_index) {
 | 
|      case kNumberStringCacheRootIndex:
 | 
| @@ -2933,6 +2900,7 @@ bool Heap::RootCanBeWrittenAfterInitialization(Heap::RootListIndex root_index) {
 | 
|      case kMicrotaskQueueRootIndex:
 | 
|      case kDetachedContextsRootIndex:
 | 
|      case kWeakObjectToCodeTableRootIndex:
 | 
| +    case kWeakNewSpaceObjectToCodeListRootIndex:
 | 
|      case kRetainedMapsRootIndex:
 | 
|      case kNoScriptSharedFunctionInfosRootIndex:
 | 
|      case kWeakStackTraceListRootIndex:
 | 
| @@ -5565,6 +5533,18 @@ void Heap::RemoveGCEpilogueCallback(v8::Isolate::GCCallback callback) {
 | 
|  }
 | 
|  
 | 
|  // TODO(ishell): Find a better place for this.
 | 
| +void Heap::AddWeakNewSpaceObjectToCodeDependency(Handle<HeapObject> obj,
 | 
| +                                                 Handle<WeakCell> code) {
 | 
| +  DCHECK(InNewSpace(*obj));
 | 
| +  DCHECK(!InNewSpace(*code));
 | 
| +  Handle<ArrayList> list(weak_new_space_object_to_code_list(), isolate());
 | 
| +  list = ArrayList::Add(list, isolate()->factory()->NewWeakCell(obj), code);
 | 
| +  if (*list != weak_new_space_object_to_code_list()) {
 | 
| +    set_weak_new_space_object_to_code_list(*list);
 | 
| +  }
 | 
| +}
 | 
| +
 | 
| +// TODO(ishell): Find a better place for this.
 | 
|  void Heap::AddWeakObjectToCodeDependency(Handle<HeapObject> obj,
 | 
|                                           Handle<DependentCode> dep) {
 | 
|    DCHECK(!InNewSpace(*obj));
 | 
| @@ -5719,6 +5699,26 @@ void Heap::ClearRecordedSlotRange(Address start, Address end) {
 | 
|    }
 | 
|  }
 | 
|  
 | 
| +void Heap::RecordWriteIntoCodeSlow(Code* host, RelocInfo* rinfo,
 | 
| +                                   Object* value) {
 | 
| +  DCHECK(InNewSpace(value));
 | 
| +  Page* source_page = Page::FromAddress(reinterpret_cast<Address>(host));
 | 
| +  RelocInfo::Mode rmode = rinfo->rmode();
 | 
| +  Address addr = rinfo->pc();
 | 
| +  SlotType slot_type = SlotTypeForRelocInfoMode(rmode);
 | 
| +  if (rinfo->IsInConstantPool()) {
 | 
| +    addr = rinfo->constant_pool_entry_address();
 | 
| +    if (RelocInfo::IsCodeTarget(rmode)) {
 | 
| +      slot_type = CODE_ENTRY_SLOT;
 | 
| +    } else {
 | 
| +      DCHECK(RelocInfo::IsEmbeddedObject(rmode));
 | 
| +      slot_type = OBJECT_SLOT;
 | 
| +    }
 | 
| +  }
 | 
| +  RememberedSet<OLD_TO_NEW>::InsertTyped(
 | 
| +      source_page, reinterpret_cast<Address>(host), slot_type, addr);
 | 
| +}
 | 
| +
 | 
|  Space* AllSpaces::next() {
 | 
|    switch (counter_++) {
 | 
|      case NEW_SPACE:
 | 
| 
 |