Index: src/heap/mark-compact.cc |
diff --git a/src/heap/mark-compact.cc b/src/heap/mark-compact.cc |
index cd9f548f534f2194a6a0e3451d747bcee5fbe2c9..8e1be75877b4b93ec2a62a211a0d3d7773047830 100644 |
--- a/src/heap/mark-compact.cc |
+++ b/src/heap/mark-compact.cc |
@@ -1196,10 +1196,12 @@ |
StackLimitCheck check(heap->isolate()); |
if (check.HasOverflowed()) return false; |
- if (ObjectMarking::WhiteToBlack<MarkBit::NON_ATOMIC>( |
- object, MarkingState::External(object))) { |
- IterateBody(object->map(), object); |
- } |
+ 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); |
return true; |
} |
}; |
@@ -1235,7 +1237,11 @@ |
// 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)) { |
- return ObjectMarking::WhiteToBlack(object, MarkingState::Internal(object)); |
+ if (ObjectMarking::IsWhite(object, MarkingState::Internal(object))) { |
+ ObjectMarking::WhiteToBlack(object, MarkingState::Internal(object)); |
+ return true; |
+ } |
+ return false; |
} |
// Mark object pointed to by p. |
@@ -1253,15 +1259,14 @@ |
HeapObject* obj)) { |
#ifdef DEBUG |
DCHECK(collector->heap()->Contains(obj)); |
+ DCHECK(ObjectMarking::IsWhite(obj, MarkingState::Internal(obj))); |
#endif |
- 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); |
- } |
+ 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). |
@@ -1279,6 +1284,8 @@ |
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; |
@@ -1475,12 +1482,16 @@ |
if (!collector_->heap()->InNewSpace(object)) return; |
- if (ObjectMarking::WhiteToBlack<MarkBit::NON_ATOMIC>( |
- object, MarkingState::External(object))) { |
- Map* map = object->map(); |
- StaticYoungGenerationMarkingVisitor::IterateBody(map, object); |
- collector_->EmptyMarkingDeque(); |
- } |
+ 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(); |
} |
MinorMarkCompactCollector* collector_; |
@@ -1521,16 +1532,22 @@ |
HeapObject* object = HeapObject::cast(*p); |
- 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(); |
- } |
+ 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(); |
} |
MarkCompactCollector* collector_; |
@@ -1701,7 +1718,8 @@ |
Map* filler_map = heap()->one_pointer_filler_map(); |
for (HeapObject* object = it->Next(); object != NULL; object = it->Next()) { |
if ((object->map() != filler_map) && |
- ObjectMarking::GreyToBlack(object, MarkingState::Internal(object))) { |
+ ObjectMarking::IsGrey(object, MarkingState::Internal(object))) { |
+ ObjectMarking::GreyToBlack(object, MarkingState::Internal(object)); |
PushBlack(object); |
if (marking_deque()->IsFull()) return; |
} |
@@ -1713,10 +1731,8 @@ |
LiveObjectIterator<kGreyObjects> it(p, MarkingState::Internal(p)); |
HeapObject* object = NULL; |
while ((object = it.Next()) != NULL) { |
- bool success = |
- ObjectMarking::GreyToBlack(object, MarkingState::Internal(object)); |
- DCHECK(success); |
- USE(success); |
+ DCHECK(ObjectMarking::IsGrey(object, MarkingState::Internal(object))); |
+ ObjectMarking::GreyToBlack(object, MarkingState::Internal(object)); |
PushBlack(object); |
if (marking_deque()->IsFull()) return; |
} |
@@ -2279,12 +2295,15 @@ |
void MarkCompactCollector::MarkStringTable(RootMarkingVisitor* visitor) { |
StringTable* string_table = heap()->string_table(); |
// Mark the string table itself. |
- if (ObjectMarking::WhiteToBlack(string_table, |
- MarkingState::Internal(string_table))) { |
- // Explicitly mark the prefix. |
- string_table->IteratePrefix(visitor); |
- ProcessMarkingDeque(); |
- } |
+ 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); |
+ ProcessMarkingDeque(); |
} |
void MarkCompactCollector::MarkRoots(RootMarkingVisitor* visitor) { |