Index: src/heap/spaces.h |
diff --git a/src/heap/spaces.h b/src/heap/spaces.h |
index eec533f9a1e01a4c470fc274c809ddde59234923..7ed1c5ec85ba79edf352ec37ffb4b377208752e4 100644 |
--- a/src/heap/spaces.h |
+++ b/src/heap/spaces.h |
@@ -1620,25 +1620,6 @@ class HeapObjectIterator : public ObjectIterator { |
// ----------------------------------------------------------------------------- |
-// A PageIterator iterates the pages in a paged space. |
- |
-class PageIterator BASE_EMBEDDED { |
- public: |
- explicit inline PageIterator(PagedSpace* space); |
- |
- inline bool has_next(); |
- inline Page* next(); |
- |
- private: |
- PagedSpace* space_; |
- Page* prev_page_; // Previous page returned. |
- // Next page that will be returned. Cached here so that we can use this |
- // iterator for operations that deallocate pages. |
- Page* next_page_; |
-}; |
- |
- |
-// ----------------------------------------------------------------------------- |
// A space has a circular list of pages. The next page can be accessed via |
// Page::next_page() call. |
@@ -2086,8 +2067,49 @@ class LocalAllocationBuffer { |
AllocationInfo allocation_info_; |
}; |
+template <class PAGE_TYPE> |
+class PageIteratorImpl |
+ : public std::iterator<std::forward_iterator_tag, PAGE_TYPE> { |
+ public: |
+ explicit PageIteratorImpl(PAGE_TYPE* p) : p_(p) {} |
+ PageIteratorImpl(const PageIteratorImpl<PAGE_TYPE>& other) : p_(other.p_) {} |
+ PAGE_TYPE* operator*() { return p_; } |
+ bool operator==(const PageIteratorImpl<PAGE_TYPE>& rhs) { |
+ return rhs.p_ == p_; |
+ } |
+ bool operator!=(const PageIteratorImpl<PAGE_TYPE>& rhs) { |
+ return rhs.p_ != p_; |
+ } |
+ inline PageIteratorImpl<PAGE_TYPE>& operator++(); |
+ inline PageIteratorImpl<PAGE_TYPE> operator++(int); |
+ |
+ private: |
+ PAGE_TYPE* p_; |
+}; |
+ |
+typedef PageIteratorImpl<Page> PageIterator; |
+typedef PageIteratorImpl<LargePage> LargePageIterator; |
+ |
+class NewSpacePageRange { |
+ public: |
+ typedef PageIterator iterator; |
+ |
+ inline NewSpacePageRange(Address start, Address limit); |
+ |
+ iterator begin() { return iterator(Page::FromAddress(start_)); } |
+ iterator end() { |
+ return iterator(Page::FromAllocationAreaAddress(limit_)->next_page()); |
+ } |
+ |
+ private: |
+ Address start_; |
+ Address limit_; |
+}; |
+ |
class PagedSpace : public Space { |
public: |
+ typedef PageIterator iterator; |
+ |
static const intptr_t kCompactionMemoryWanted = 500 * KB; |
// Creates a space with an id. |
@@ -2296,6 +2318,9 @@ class PagedSpace : public Space { |
inline void UnlinkFreeListCategories(Page* page); |
inline intptr_t RelinkFreeListCategories(Page* page); |
+ iterator begin() { return iterator(anchor_.next_page()); } |
+ iterator end() { return iterator(&anchor_); } |
+ |
protected: |
// PagedSpaces that should be included in snapshots have different, i.e., |
// smaller, initial pages. |
@@ -2350,7 +2375,6 @@ class PagedSpace : public Space { |
friend class IncrementalMarking; |
friend class MarkCompactCollector; |
- friend class PageIterator; |
// Used in cctest. |
friend class HeapTester; |
@@ -2401,6 +2425,8 @@ enum SemiSpaceId { kFromSpace = 0, kToSpace = 1 }; |
// space as a marking stack when tracing live objects. |
class SemiSpace : public Space { |
public: |
+ typedef PageIterator iterator; |
+ |
static void Swap(SemiSpace* from, SemiSpace* to); |
SemiSpace(Heap* heap, SemiSpaceId semispace) |
@@ -2525,6 +2551,9 @@ class SemiSpace : public Space { |
virtual void Verify(); |
#endif |
+ iterator begin() { return iterator(anchor_.next_page()); } |
+ iterator end() { return iterator(anchor()); } |
+ |
private: |
void RewindPages(Page* start, int num_pages); |
@@ -2555,7 +2584,6 @@ class SemiSpace : public Space { |
int pages_used_; |
friend class NewSpace; |
- friend class NewSpacePageIterator; |
friend class SemiSpaceIterator; |
}; |
@@ -2584,35 +2612,6 @@ class SemiSpaceIterator : public ObjectIterator { |
Address limit_; |
}; |
- |
-// ----------------------------------------------------------------------------- |
-// A PageIterator iterates the pages in a semi-space. |
-class NewSpacePageIterator BASE_EMBEDDED { |
- public: |
- // Make an iterator that runs over all pages in to-space. |
- explicit inline NewSpacePageIterator(NewSpace* space); |
- |
- // Make an iterator that runs over all pages in the given semispace, |
- // even those not used in allocation. |
- explicit inline NewSpacePageIterator(SemiSpace* space); |
- |
- // Make iterator that iterates from the page containing start |
- // to the page that contains limit in the same semispace. |
- inline NewSpacePageIterator(Address start, Address limit); |
- |
- inline bool has_next(); |
- inline Page* next(); |
- |
- private: |
- Page* prev_page_; // Previous page returned. |
- // Next page that will be returned. Cached here so that we can use this |
- // iterator for operations that deallocate pages. |
- Page* next_page_; |
- // Last page returned. |
- Page* last_page_; |
-}; |
- |
- |
// ----------------------------------------------------------------------------- |
// The young generation space. |
// |
@@ -2621,6 +2620,8 @@ class NewSpacePageIterator BASE_EMBEDDED { |
class NewSpace : public Space { |
public: |
+ typedef PageIterator iterator; |
+ |
explicit NewSpace(Heap* heap) |
: Space(heap, NEW_SPACE, NOT_EXECUTABLE), |
to_space_(heap, kToSpace), |
@@ -2884,6 +2885,9 @@ class NewSpace : public Space { |
void PauseAllocationObservers() override; |
void ResumeAllocationObservers() override; |
+ iterator begin() { return to_space_.begin(); } |
+ iterator end() { return to_space_.end(); } |
+ |
private: |
// Update allocation info to match the current to-space page. |
void UpdateAllocationInfo(); |
@@ -3027,6 +3031,8 @@ class MapSpace : public PagedSpace { |
class LargeObjectSpace : public Space { |
public: |
+ typedef LargePageIterator iterator; |
+ |
LargeObjectSpace(Heap* heap, AllocationSpace id); |
virtual ~LargeObjectSpace(); |
@@ -3088,6 +3094,9 @@ class LargeObjectSpace : public Space { |
// Collect code statistics. |
void CollectCodeStatistics(); |
+ iterator begin() { return iterator(first_page_); } |
+ iterator end() { return iterator(nullptr); } |
+ |
#ifdef VERIFY_HEAP |
virtual void Verify(); |
#endif |
@@ -3123,16 +3132,6 @@ class LargeObjectIterator : public ObjectIterator { |
LargePage* current_; |
}; |
-class LargePageIterator BASE_EMBEDDED { |
- public: |
- explicit inline LargePageIterator(LargeObjectSpace* space); |
- |
- inline LargePage* next(); |
- |
- private: |
- LargePage* next_page_; |
-}; |
- |
// Iterates over the chunks (pages and large object pages) that can contain |
// pointers to new space or to evacuation candidates. |
class MemoryChunkIterator BASE_EMBEDDED { |
@@ -3150,6 +3149,7 @@ class MemoryChunkIterator BASE_EMBEDDED { |
kLargeObjectState, |
kFinishedState |
}; |
+ Heap* heap_; |
State state_; |
PageIterator old_iterator_; |
PageIterator code_iterator_; |