Chromium Code Reviews| Index: src/heap/mark-compact.cc |
| diff --git a/src/heap/mark-compact.cc b/src/heap/mark-compact.cc |
| index f6d98bed55126cc86cfe0e779855bcb0fbee145a..9f6b47f1e8b3231ca51dad3513c4a782593c30a8 100644 |
| --- a/src/heap/mark-compact.cc |
| +++ b/src/heap/mark-compact.cc |
| @@ -1176,12 +1176,10 @@ class StaticYoungGenerationMarkingVisitor |
| StackLimitCheck check(heap->isolate()); |
| if (check.HasOverflowed()) return false; |
| - if (ObjectMarking::IsBlackOrGrey<MarkBit::NON_ATOMIC>( |
| - object, MarkingState::External(object))) |
| - return true; |
| - ObjectMarking::WhiteToBlack<MarkBit::NON_ATOMIC>( |
| - object, MarkingState::External(object)); |
| - IterateBody(object->map(), object); |
| + if (ObjectMarking::WhiteToBlack<MarkBit::NON_ATOMIC>( |
| + object, MarkingState::External(object))) { |
| + IterateBody(object->map(), object); |
| + } |
| return true; |
| } |
| }; |
| @@ -1217,11 +1215,7 @@ class MarkCompactMarkingVisitor |
| // Marks the object black without pushing it on the marking stack. |
| // Returns true if object needed marking and false otherwise. |
| INLINE(static bool MarkObjectWithoutPush(Heap* heap, HeapObject* object)) { |
| - if (ObjectMarking::IsWhite(object, MarkingState::Internal(object))) { |
| - ObjectMarking::WhiteToBlack(object, MarkingState::Internal(object)); |
| - return true; |
| - } |
| - return false; |
| + return ObjectMarking::WhiteToBlack(object, MarkingState::Internal(object)); |
| } |
| // Mark object pointed to by p. |
| @@ -1239,14 +1233,15 @@ class MarkCompactMarkingVisitor |
| HeapObject* obj)) { |
| #ifdef DEBUG |
| DCHECK(collector->heap()->Contains(obj)); |
| - DCHECK(ObjectMarking::IsWhite(obj, MarkingState::Internal(obj))); |
| #endif |
| - Map* map = obj->map(); |
| - Heap* heap = obj->GetHeap(); |
| - ObjectMarking::WhiteToBlack(obj, MarkingState::Internal(obj)); |
| - // Mark the map pointer and the body. |
| - heap->mark_compact_collector()->MarkObject(map); |
| - IterateBody(map, obj); |
| + if (ObjectMarking::WhiteToBlack(obj, MarkingState::Internal(obj))) { |
| + Map* map = obj->map(); |
| + Heap* heap = obj->GetHeap(); |
| + ObjectMarking::WhiteToBlack(obj, MarkingState::Internal(obj)); |
| + // Mark the map pointer and the body. |
| + heap->mark_compact_collector()->MarkObject(map); |
| + IterateBody(map, obj); |
| + } |
| } |
| // Visit all unmarked objects pointed to by [start, end). |
| @@ -1264,8 +1259,6 @@ class MarkCompactMarkingVisitor |
| if (!o->IsHeapObject()) continue; |
| collector->RecordSlot(object, p, o); |
| HeapObject* obj = HeapObject::cast(o); |
| - if (ObjectMarking::IsBlackOrGrey(obj, MarkingState::Internal(obj))) |
| - continue; |
| VisitUnmarkedObject(collector, obj); |
| } |
| return true; |
| @@ -1462,16 +1455,12 @@ class MinorMarkCompactCollector::RootMarkingVisitor : public RootVisitor { |
| if (!collector_->heap()->InNewSpace(object)) return; |
| - if (ObjectMarking::IsBlackOrGrey<MarkBit::NON_ATOMIC>( |
| - object, MarkingState::External(object))) |
| - return; |
| - |
| - Map* map = object->map(); |
| - ObjectMarking::WhiteToBlack<MarkBit::NON_ATOMIC>( |
| - object, MarkingState::External(object)); |
| - StaticYoungGenerationMarkingVisitor::IterateBody(map, object); |
| - |
| - collector_->EmptyMarkingDeque(); |
| + if (ObjectMarking::WhiteToBlack<MarkBit::NON_ATOMIC>( |
| + object, MarkingState::External(object))) { |
| + Map* map = object->map(); |
| + StaticYoungGenerationMarkingVisitor::IterateBody(map, object); |
| + collector_->EmptyMarkingDeque(); |
| + } |
| } |
| MinorMarkCompactCollector* collector_; |
| @@ -1512,22 +1501,16 @@ class MarkCompactCollector::RootMarkingVisitor : public ObjectVisitor, |
| HeapObject* object = HeapObject::cast(*p); |
| - if (ObjectMarking::IsBlackOrGrey<MarkBit::NON_ATOMIC>( |
| - object, MarkingState::Internal(object))) |
| - return; |
| - |
| - Map* map = object->map(); |
| - // Mark the object. |
| - ObjectMarking::WhiteToBlack<MarkBit::NON_ATOMIC>( |
| - object, MarkingState::Internal(object)); |
| - |
| - // Mark the map pointer and body, and push them on the marking stack. |
| - collector_->MarkObject(map); |
| - MarkCompactMarkingVisitor::IterateBody(map, object); |
| - |
| - // Mark all the objects reachable from the map and body. May leave |
| - // overflowed objects in the heap. |
| - collector_->EmptyMarkingDeque(); |
| + if (ObjectMarking::WhiteToBlack<MarkBit::NON_ATOMIC>( |
| + object, MarkingState::Internal(object))) { |
| + Map* map = object->map(); |
| + // Mark the map pointer and body, and push them on the marking stack. |
| + collector_->MarkObject(map); |
| + MarkCompactMarkingVisitor::IterateBody(map, object); |
| + // Mark all the objects reachable from the map and body. May leave |
| + // overflowed objects in the heap. |
| + collector_->EmptyMarkingDeque(); |
| + } |
| } |
| MarkCompactCollector* collector_; |
| @@ -1638,8 +1621,7 @@ void MarkCompactCollector::DiscoverGreyObjectsWithIterator(T* it) { |
| Map* filler_map = heap()->one_pointer_filler_map(); |
| for (HeapObject* object = it->Next(); object != NULL; object = it->Next()) { |
| if ((object->map() != filler_map) && |
| - ObjectMarking::IsGrey(object, MarkingState::Internal(object))) { |
| - ObjectMarking::GreyToBlack(object, MarkingState::Internal(object)); |
| + ObjectMarking::GreyToBlack(object, MarkingState::Internal(object))) { |
| PushBlack(object); |
| if (marking_deque()->IsFull()) return; |
| } |
| @@ -1651,8 +1633,10 @@ void MarkCompactCollector::DiscoverGreyObjectsOnPage(MemoryChunk* p) { |
| LiveObjectIterator<kGreyObjects> it(p, MarkingState::Internal(p)); |
| HeapObject* object = NULL; |
| while ((object = it.Next()) != NULL) { |
| - DCHECK(ObjectMarking::IsGrey(object, MarkingState::Internal(object))); |
| - ObjectMarking::GreyToBlack(object, MarkingState::Internal(object)); |
| + bool success = |
| + ObjectMarking::GreyToBlack(object, MarkingState::Internal(object)); |
| + DCHECK(success); |
| + USE(success); |
| PushBlack(object); |
| if (marking_deque()->IsFull()) return; |
| } |
| @@ -2146,15 +2130,12 @@ bool MarkCompactCollector::IsUnmarkedHeapObject(Object** p) { |
| void MarkCompactCollector::MarkStringTable(RootMarkingVisitor* visitor) { |
| StringTable* string_table = heap()->string_table(); |
| // Mark the string table itself. |
| - if (ObjectMarking::IsWhite(string_table, |
| - MarkingState::Internal(string_table))) { |
| - // String table could have already been marked by visiting the handles list. |
| - ObjectMarking::WhiteToBlack(string_table, |
| - MarkingState::Internal(string_table)); |
| - } |
| - // Explicitly mark the prefix. |
| - string_table->IteratePrefix(visitor); |
|
Michael Lippautz
2017/05/03 07:48:39
:)
|
| - ProcessMarkingDeque(); |
| + if (ObjectMarking::WhiteToBlack(string_table, |
| + MarkingState::Internal(string_table))) { |
| + // Explicitly mark the prefix. |
| + string_table->IteratePrefix(visitor); |
| + ProcessMarkingDeque(); |
| + } |
| } |
| void MarkCompactCollector::MarkRoots(RootMarkingVisitor* visitor) { |