| Index: src/spaces.h | 
| =================================================================== | 
| --- src/spaces.h	(revision 6554) | 
| +++ src/spaces.h	(working copy) | 
| @@ -46,34 +46,26 @@ | 
| // | 
| // The semispaces of the young generation are contiguous.  The old and map | 
| // spaces consists of a list of pages. A page has a page header and an object | 
| -// area. A page size is deliberately chosen as 8K bytes. | 
| -// The first word of a page is an opaque page header that has the | 
| -// address of the next page and its ownership information. The second word may | 
| -// have the allocation top address of this page. Heap objects are aligned to the | 
| -// pointer size. | 
| +// area. | 
| // | 
| // There is a separate large object space for objects larger than | 
| // Page::kMaxHeapObjectSize, so that they do not have to move during | 
| // collection. The large object space is paged. Pages in large object space | 
| -// may be larger than 8K. | 
| +// may be larger than the page size. | 
| // | 
| -// A card marking write barrier is used to keep track of intergenerational | 
| -// references. Old space pages are divided into regions of Page::kRegionSize | 
| -// size. Each region has a corresponding dirty bit in the page header which is | 
| -// set if the region might contain pointers to new space. For details about | 
| -// dirty bits encoding see comments in the Page::GetRegionNumberForAddress() | 
| -// method body. | 
| +// A store-buffer based write barrier is used to keep track of intergenerational | 
| +// references.  See store-buffer.h. | 
| // | 
| -// During scavenges and mark-sweep collections we iterate intergenerational | 
| -// pointers without decoding heap object maps so if the page belongs to old | 
| -// pointer space or large object space it is essential to guarantee that | 
| -// the page does not contain any garbage pointers to new space: every pointer | 
| -// aligned word which satisfies the Heap::InNewSpace() predicate must be a | 
| -// pointer to a live heap object in new space. Thus objects in old pointer | 
| -// and large object spaces should have a special layout (e.g. no bare integer | 
| -// fields). This requirement does not apply to map space which is iterated in | 
| -// a special fashion. However we still require pointer fields of dead maps to | 
| -// be cleaned. | 
| +// During scavenges and mark-sweep collections we sometimes (after a store | 
| +// buffer overflow) iterate intergenerational pointers without decoding heap | 
| +// object maps so if the page belongs to old pointer space or large object | 
| +// space it is essential to guarantee that the page does not contain any | 
| +// garbage pointers to new space: every pointer aligned word which satisfies | 
| +// the Heap::InNewSpace() predicate must be a pointer to a live heap object in | 
| +// new space. Thus objects in old pointer and large object spaces should have a | 
| +// special layout (e.g. no bare integer fields). This requirement does not | 
| +// apply to map space which is iterated in a special fashion. However we still | 
| +// require pointer fields of dead maps to be cleaned. | 
| // | 
| // To enable lazy cleaning of old space pages we use a notion of allocation | 
| // watermark. Every pointer under watermark is considered to be well formed. | 
| @@ -498,25 +490,7 @@ | 
| } | 
|  | 
| // --------------------------------------------------------------------- | 
| -  // Card marking support | 
|  | 
| -  static const uint32_t kAllRegionsCleanMarks = 0x0; | 
| -  static const uint32_t kAllRegionsDirtyMarks = 0xFFFFFFFF; | 
| - | 
| -  inline uint32_t GetRegionMarks(); | 
| -  inline void SetRegionMarks(uint32_t dirty); | 
| - | 
| -  inline uint32_t GetRegionMaskForAddress(Address addr); | 
| -  inline uint32_t GetRegionMaskForSpan(Address start, int length_in_bytes); | 
| -  inline int GetRegionNumberForAddress(Address addr); | 
| - | 
| -  inline void MarkRegionDirty(Address addr); | 
| -  inline bool IsRegionDirty(Address addr); | 
| - | 
| -  inline void ClearRegionMarks(Address start, | 
| -                               Address end, | 
| -                               bool reaches_limit); | 
| - | 
| // Page size in bytes.  This must be a multiple of the OS page size. | 
| static const int kPageSize = 1 << kPageSizeBits; | 
|  | 
| @@ -541,15 +515,6 @@ | 
| MarkbitsBitmap::kBitsPerCellLog2; | 
|  | 
|  | 
| -#ifdef ENABLE_CARDMARKING_WRITE_BARRIER | 
| -  static const int kDirtyFlagOffset = 2 * kPointerSize; | 
| -  static const int kRegionSizeLog2 = 8; | 
| -  static const int kRegionSize = 1 << kRegionSizeLog2; | 
| -  static const intptr_t kRegionAlignmentMask = (kRegionSize - 1); | 
| - | 
| -  STATIC_CHECK(kRegionSize == kPageSize / kBitsPerInt); | 
| -#endif | 
| - | 
| enum PageFlag { | 
| // Page allocation watermark was bumped by preallocation during scavenge. | 
| // Correct watermark can be retrieved by CachedAllocationWatermark() method | 
| @@ -2160,56 +2125,9 @@ | 
| // Should be called after forced sweep to find out if map space needs | 
| // compaction. | 
| bool NeedsCompaction(int live_maps) { | 
| -    return !MapPointersEncodable() && live_maps <= CompactionThreshold(); | 
| +    return false;  // TODO(gc): Bring back map compaction. | 
| } | 
|  | 
| -  Address TopAfterCompaction(int live_maps) { | 
| -    ASSERT(NeedsCompaction(live_maps)); | 
| - | 
| -    int pages_left = live_maps / kMapsPerPage; | 
| -    PageIterator it(this, PageIterator::ALL_PAGES); | 
| -    while (pages_left-- > 0) { | 
| -      ASSERT(it.has_next()); | 
| -      it.next()->SetRegionMarks(Page::kAllRegionsCleanMarks); | 
| -    } | 
| -    ASSERT(it.has_next()); | 
| -    Page* top_page = it.next(); | 
| -    top_page->SetRegionMarks(Page::kAllRegionsCleanMarks); | 
| -    ASSERT(top_page->is_valid()); | 
| - | 
| -    int offset = live_maps % kMapsPerPage * Map::kSize; | 
| -    Address top = top_page->ObjectAreaStart() + offset; | 
| -    ASSERT(top < top_page->ObjectAreaEnd()); | 
| -    ASSERT(Contains(top)); | 
| - | 
| -    return top; | 
| -  } | 
| - | 
| -  void FinishCompaction(Address new_top, int live_maps) { | 
| -    Page* top_page = Page::FromAddress(new_top); | 
| -    ASSERT(top_page->is_valid()); | 
| - | 
| -    SetAllocationInfo(&allocation_info_, top_page); | 
| -    allocation_info_.top = new_top; | 
| - | 
| -    int new_size = live_maps * Map::kSize; | 
| -    accounting_stats_.DeallocateBytes(accounting_stats_.Size()); | 
| -    accounting_stats_.AllocateBytes(new_size); | 
| - | 
| -#ifdef DEBUG | 
| -    if (FLAG_enable_slow_asserts) { | 
| -      intptr_t actual_size = 0; | 
| -      for (Page* p = first_page_; p != top_page; p = p->next_page()) | 
| -        actual_size += kMapsPerPage * Map::kSize; | 
| -      actual_size += (new_top - top_page->ObjectAreaStart()); | 
| -      ASSERT(accounting_stats_.Size() == actual_size); | 
| -    } | 
| -#endif | 
| - | 
| -    Shrink(); | 
| -    ResetFreeList(); | 
| -  } | 
| - | 
| protected: | 
| #ifdef DEBUG | 
| virtual void VerifyObject(HeapObject* obj); | 
| @@ -2305,8 +2223,8 @@ | 
| // if such a page doesn't exist. | 
| LargePage* FindPageContainingPc(Address pc); | 
|  | 
| -  // Iterates objects covered by dirty regions. | 
| -  void IterateDirtyRegions(ObjectSlotCallback func); | 
| +  // Iterates over pointers to new space. | 
| +  void IteratePointersToNewSpace(ObjectSlotCallback func); | 
|  | 
| // Frees unmarked objects. | 
| void FreeUnmarkedObjects(); | 
|  |