| 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_,
 | 
| 
 |