| Index: src/spaces.cc | 
| diff --git a/src/spaces.cc b/src/spaces.cc | 
| index bfeb522570de26e6062c479a060ec60686dbefbc..0e38c9fd58a66893e074b461c1f49b7d78217100 100644 | 
| --- a/src/spaces.cc | 
| +++ b/src/spaces.cc | 
| @@ -1673,13 +1673,13 @@ void FreeListNode::set_next(FreeListNode* next) { | 
| } | 
|  | 
|  | 
| -OldSpaceFreeList::OldSpaceFreeList(PagedSpace* owner) | 
| +FreeList::FreeList(PagedSpace* owner) | 
| : owner_(owner), heap_(owner->heap()) { | 
| Reset(); | 
| } | 
|  | 
|  | 
| -void OldSpaceFreeList::Reset() { | 
| +void FreeList::Reset() { | 
| available_ = 0; | 
| small_list_ = NULL; | 
| medium_list_ = NULL; | 
| @@ -1688,7 +1688,7 @@ void OldSpaceFreeList::Reset() { | 
| } | 
|  | 
|  | 
| -int OldSpaceFreeList::Free(Address start, int size_in_bytes) { | 
| +int FreeList::Free(Address start, int size_in_bytes) { | 
| if (size_in_bytes == 0) return 0; | 
| FreeListNode* node = FreeListNode::FromAddress(start); | 
| node->set_size(heap_, size_in_bytes); | 
| @@ -1721,7 +1721,7 @@ int OldSpaceFreeList::Free(Address start, int size_in_bytes) { | 
| // allocation space has been set up with the top and limit of the space.  If | 
| // the allocation fails then NULL is returned, and the caller can perform a GC | 
| // or allocate a new page before retrying. | 
| -HeapObject* OldSpaceFreeList::Allocate(int size_in_bytes) { | 
| +HeapObject* FreeList::Allocate(int size_in_bytes) { | 
| ASSERT(0 < size_in_bytes); | 
| ASSERT(size_in_bytes <= kMaxBlockSize); | 
| ASSERT(IsAligned(size_in_bytes, kPointerSize)); | 
| @@ -1802,8 +1802,28 @@ HeapObject* OldSpaceFreeList::Allocate(int size_in_bytes) { | 
| } | 
|  | 
|  | 
| +static intptr_t CountFreeListItemsInList(FreeListNode* n, Page* p) { | 
| +  intptr_t sum = 0; | 
| +  while (n != NULL) { | 
| +    if (Page::FromAddress(n->address()) == p) { | 
| +      FreeSpace* free_space = reinterpret_cast<FreeSpace*>(n); | 
| +      sum += free_space->Size(); | 
| +    } | 
| +    n = n->next(); | 
| +  } | 
| +  return sum; | 
| +} | 
| + | 
| + | 
| +void FreeList::CountFreeListItems(Page* p, intptr_t* sizes) { | 
| +  sizes[0] = CountFreeListItemsInList(small_list_, p); | 
| +  sizes[1] = CountFreeListItemsInList(medium_list_, p); | 
| +  sizes[2] = CountFreeListItemsInList(large_list_, p); | 
| +  sizes[3] = CountFreeListItemsInList(huge_list_, p); | 
| +} | 
| + | 
| #ifdef DEBUG | 
| -intptr_t OldSpaceFreeList::SumFreeList(FreeListNode* cur) { | 
| +intptr_t FreeList::SumFreeList(FreeListNode* cur) { | 
| intptr_t sum = 0; | 
| while (cur != NULL) { | 
| ASSERT(cur->map() == HEAP->raw_unchecked_free_space_map()); | 
| @@ -1818,7 +1838,7 @@ intptr_t OldSpaceFreeList::SumFreeList(FreeListNode* cur) { | 
| static const int kVeryLongFreeList = 500; | 
|  | 
|  | 
| -int OldSpaceFreeList::FreeListLength(FreeListNode* cur) { | 
| +int FreeList::FreeListLength(FreeListNode* cur) { | 
| int length = 0; | 
| while (cur != NULL) { | 
| length++; | 
| @@ -1829,7 +1849,7 @@ int OldSpaceFreeList::FreeListLength(FreeListNode* cur) { | 
| } | 
|  | 
|  | 
| -bool OldSpaceFreeList::IsVeryLong() { | 
| +bool FreeList::IsVeryLong() { | 
| if (FreeListLength(small_list_) == kVeryLongFreeList) return  true; | 
| if (FreeListLength(medium_list_) == kVeryLongFreeList) return  true; | 
| if (FreeListLength(large_list_) == kVeryLongFreeList) return  true; | 
| @@ -1841,7 +1861,7 @@ bool OldSpaceFreeList::IsVeryLong() { | 
| // This can take a very long time because it is linear in the number of entries | 
| // on the free list, so it should not be called if FreeListLength returns | 
| // kVeryLongFreeList. | 
| -intptr_t OldSpaceFreeList::SumFreeLists() { | 
| +intptr_t FreeList::SumFreeLists() { | 
| intptr_t sum = SumFreeList(small_list_); | 
| sum += SumFreeList(medium_list_); | 
| sum += SumFreeList(large_list_); | 
| @@ -1854,15 +1874,14 @@ intptr_t OldSpaceFreeList::SumFreeLists() { | 
| // ----------------------------------------------------------------------------- | 
| // OldSpace implementation | 
|  | 
| -void OldSpace::PrepareForMarkCompact(bool will_compact) { | 
| -  ASSERT(!will_compact); | 
| +void OldSpace::PrepareForMarkCompact() { | 
| // Call prepare of the super class. | 
| -  PagedSpace::PrepareForMarkCompact(will_compact); | 
| +  PagedSpace::PrepareForMarkCompact(); | 
|  | 
| +  // Stop lazy sweeping for this space. | 
| first_unswept_page_ = last_unswept_page_ = Page::FromAddress(NULL); | 
|  | 
| // Clear the free list before a full GC---it will be rebuilt afterward. | 
| -  // TODO(gc): can we avoid resetting free list? | 
| free_list_.Reset(); | 
| } | 
|  | 
| @@ -1877,8 +1896,7 @@ bool NewSpace::ReserveSpace(int bytes) { | 
| } | 
|  | 
|  | 
| -void PagedSpace::PrepareForMarkCompact(bool will_compact) { | 
| -  ASSERT(!will_compact); | 
| +void PagedSpace::PrepareForMarkCompact() { | 
| // We don't have a linear allocation area while sweeping.  It will be restored | 
| // on the first allocation after the sweep. | 
| // Mark the old linear allocation area with a free space map so it can be | 
| @@ -2126,11 +2144,9 @@ void PagedSpace::ReportStatistics() { | 
| // ----------------------------------------------------------------------------- | 
| // FixedSpace implementation | 
|  | 
| -void FixedSpace::PrepareForMarkCompact(bool will_compact) { | 
| +void FixedSpace::PrepareForMarkCompact() { | 
| // Call prepare of the super class. | 
| -  PagedSpace::PrepareForMarkCompact(will_compact); | 
| - | 
| -  ASSERT(!will_compact); | 
| +  PagedSpace::PrepareForMarkCompact(); | 
|  | 
| // During a non-compacting collection, everything below the linear | 
| // allocation pointer except wasted top-of-page blocks is considered | 
| @@ -2146,12 +2162,6 @@ void FixedSpace::PrepareForMarkCompact(bool will_compact) { | 
| // ----------------------------------------------------------------------------- | 
| // MapSpace implementation | 
|  | 
| -void MapSpace::PrepareForMarkCompact(bool will_compact) { | 
| -  // Call prepare of the super class. | 
| -  FixedSpace::PrepareForMarkCompact(will_compact); | 
| -} | 
| - | 
| - | 
| #ifdef DEBUG | 
| void MapSpace::VerifyObject(HeapObject* object) { | 
| // The object should be a map or a free-list node. | 
| @@ -2337,7 +2347,6 @@ void LargeObjectSpace::FreeUnmarkedObjects() { | 
| MarkBit mark_bit = Marking::MarkBitFrom(object); | 
| if (mark_bit.Get()) { | 
| mark_bit.Clear(); | 
| -      heap()->mark_compact_collector()->tracer()->decrement_marked_count(); | 
| previous = current; | 
| current = current->next_page(); | 
| } else { | 
|  |