Index: src/mark-compact-inl.h |
diff --git a/src/mark-compact-inl.h b/src/mark-compact-inl.h |
index faa75b632a905b769f967b5149a45c45d74b494a..2f7e31fea53571fa1c21c8b764c1decdadfe9103 100644 |
--- a/src/mark-compact-inl.h |
+++ b/src/mark-compact-inl.h |
@@ -52,23 +52,43 @@ void MarkCompactCollector::SetFlags(int flags) { |
} |
+bool MarkCompactCollector::MarkObjectAndPush(HeapObject* obj) { |
+ if (MarkObjectWithoutPush(obj)) { |
+ marking_deque_.PushBlack(obj); |
+ return true; |
+ } |
+ return false; |
+} |
+ |
+ |
void MarkCompactCollector::MarkObject(HeapObject* obj, MarkBit mark_bit) { |
ASSERT(Marking::MarkBitFrom(obj) == mark_bit); |
if (!mark_bit.Get()) { |
mark_bit.Set(); |
MemoryChunk::IncrementLiveBytesFromGC(obj->address(), obj->Size()); |
- ASSERT(IsMarked(obj)); |
- ASSERT(HEAP->Contains(obj)); |
- marking_deque_.PushBlack(obj); |
+ ProcessNewlyMarkedObject(obj); |
} |
} |
+bool MarkCompactCollector::MarkObjectWithoutPush(HeapObject* obj) { |
+ MarkBit mark_bit = Marking::MarkBitFrom(obj); |
+ if (!mark_bit.Get()) { |
+ SetMark(obj, mark_bit); |
+ return true; |
+ } |
+ return false; |
+} |
+ |
+ |
void MarkCompactCollector::SetMark(HeapObject* obj, MarkBit mark_bit) { |
ASSERT(!mark_bit.Get()); |
ASSERT(Marking::MarkBitFrom(obj) == mark_bit); |
mark_bit.Set(); |
MemoryChunk::IncrementLiveBytesFromGC(obj->address(), obj->Size()); |
+ if (obj->IsMap()) { |
+ heap_->ClearCacheOnMap(Map::cast(obj)); |
+ } |
} |
@@ -83,9 +103,6 @@ void MarkCompactCollector::RecordSlot(Object** anchor_slot, |
Object** slot, |
Object* object) { |
Page* object_page = Page::FromAddress(reinterpret_cast<Address>(object)); |
- // Ensure the anchor slot is on the first 'page' of a large object. |
- ASSERT(Page::FromAddress(reinterpret_cast<Address>(anchor_slot))->owner() != |
- NULL); |
if (object_page->IsEvacuationCandidate() && |
!ShouldSkipEvacuationSlotRecording(anchor_slot)) { |
if (!SlotsBuffer::AddTo(&slots_buffer_allocator_, |