Chromium Code Reviews| Index: src/heap/heap.cc |
| diff --git a/src/heap/heap.cc b/src/heap/heap.cc |
| index f830b4dd1bcfaf26a5a743a250f9bdef2ed3c522..8a14648bbe15b108678681c93611ffe0df125c5a 100644 |
| --- a/src/heap/heap.cc |
| +++ b/src/heap/heap.cc |
| @@ -1471,38 +1471,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() { |
| // Pause the inline allocation steps. |
| PauseAllocationObserversScope pause_observers(this); |
| -#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 = |
| @@ -2915,7 +2883,6 @@ void Heap::CreateInitialObjects() { |
| CreateFixedStubs(); |
| } |
| - |
| bool Heap::RootCanBeWrittenAfterInitialization(Heap::RootListIndex root_index) { |
| switch (root_index) { |
| case kNumberStringCacheRootIndex: |
| @@ -2930,6 +2897,7 @@ bool Heap::RootCanBeWrittenAfterInitialization(Heap::RootListIndex root_index) { |
| case kMicrotaskQueueRootIndex: |
| case kDetachedContextsRootIndex: |
| case kWeakObjectToCodeTableRootIndex: |
| + case kWeakNewSpaceObjectToCodeListRootIndex: |
| case kRetainedMapsRootIndex: |
| case kNoScriptSharedFunctionInfosRootIndex: |
| case kWeakStackTraceListRootIndex: |
| @@ -5592,6 +5560,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)); |
| @@ -5745,6 +5725,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()) { |
|
ulan
2016/06/09 14:45:22
Could you please extract this code into a function
ahaas
2016/06/10 11:00:34
As discussed in person sharing this code and still
|
| + 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: |