Index: src/heap/spaces-inl.h |
diff --git a/src/heap/spaces-inl.h b/src/heap/spaces-inl.h |
index d1199021ace4d16cef934531c78eebe42f9dce0a..f2dbd893ada22935a3169702e76e82d17ee7d9f3 100644 |
--- a/src/heap/spaces-inl.h |
+++ b/src/heap/spaces-inl.h |
@@ -15,6 +15,23 @@ |
namespace v8 { |
namespace internal { |
+template <class PAGE_TYPE> |
+PageIteratorImpl<PAGE_TYPE>& PageIteratorImpl<PAGE_TYPE>::operator++() { |
+ p_ = p_->next_page(); |
+ return *this; |
+} |
+ |
+template <class PAGE_TYPE> |
+PageIteratorImpl<PAGE_TYPE> PageIteratorImpl<PAGE_TYPE>::operator++(int) { |
+ PageIteratorImpl<PAGE_TYPE> tmp(*this); |
+ operator++(); |
+ return tmp; |
+} |
+ |
+NewSpacePageRange::NewSpacePageRange(Address start, Address limit) |
+ : start_(start), limit_(limit) { |
+ SemiSpace::AssertValidRange(start, limit); |
+} |
// ----------------------------------------------------------------------------- |
// Bitmap |
@@ -31,25 +48,6 @@ void Bitmap::SetAllBits(MemoryChunk* chunk) { |
bitmap->cells()[i] = 0xffffffff; |
} |
-// ----------------------------------------------------------------------------- |
-// PageIterator |
- |
-PageIterator::PageIterator(PagedSpace* space) |
- : space_(space), |
- prev_page_(&space->anchor_), |
- next_page_(prev_page_->next_page()) {} |
- |
- |
-bool PageIterator::has_next() { return next_page_ != &space_->anchor_; } |
- |
- |
-Page* PageIterator::next() { |
- DCHECK(has_next()); |
- prev_page_ = next_page_; |
- next_page_ = next_page_->next_page(); |
- return prev_page_; |
-} |
- |
// ----------------------------------------------------------------------------- |
// SemiSpaceIterator |
@@ -77,37 +75,6 @@ HeapObject* SemiSpaceIterator::next_object() { return Next(); } |
// ----------------------------------------------------------------------------- |
-// NewSpacePageIterator |
- |
-NewSpacePageIterator::NewSpacePageIterator(NewSpace* space) |
- : prev_page_(Page::FromAddress(space->ToSpaceStart())->prev_page()), |
- next_page_(Page::FromAddress(space->ToSpaceStart())), |
- last_page_(Page::FromAllocationAreaAddress(space->ToSpaceEnd())) {} |
- |
-NewSpacePageIterator::NewSpacePageIterator(SemiSpace* space) |
- : prev_page_(space->anchor()), |
- next_page_(prev_page_->next_page()), |
- last_page_(prev_page_->prev_page()) {} |
- |
-NewSpacePageIterator::NewSpacePageIterator(Address start, Address limit) |
- : prev_page_(Page::FromAddress(start)->prev_page()), |
- next_page_(Page::FromAddress(start)), |
- last_page_(Page::FromAllocationAreaAddress(limit)) { |
- SemiSpace::AssertValidRange(start, limit); |
-} |
- |
- |
-bool NewSpacePageIterator::has_next() { return prev_page_ != last_page_; } |
- |
-Page* NewSpacePageIterator::next() { |
- DCHECK(has_next()); |
- prev_page_ = next_page_; |
- next_page_ = next_page_->next_page(); |
- return prev_page_; |
-} |
- |
- |
-// ----------------------------------------------------------------------------- |
// HeapObjectIterator |
HeapObject* HeapObjectIterator::Next() { |
@@ -152,20 +119,6 @@ HeapObject* HeapObjectIterator::FromCurrentPage() { |
} |
// ----------------------------------------------------------------------------- |
-// LargePageIterator |
- |
-LargePageIterator::LargePageIterator(LargeObjectSpace* space) |
- : next_page_(space->first_page()) {} |
- |
-LargePage* LargePageIterator::next() { |
- LargePage* result = next_page_; |
- if (next_page_ != nullptr) { |
- next_page_ = next_page_->next_page(); |
- } |
- return result; |
-} |
- |
-// ----------------------------------------------------------------------------- |
// MemoryAllocator |
#ifdef ENABLE_HEAP_PROTECTION |
@@ -209,9 +162,8 @@ bool SemiSpace::Contains(Object* o) { |
} |
bool SemiSpace::ContainsSlow(Address a) { |
- NewSpacePageIterator it(this); |
- while (it.has_next()) { |
- if (it.next() == MemoryChunk::FromAddress(a)) return true; |
+ for (Page* p : *this) { |
+ if (p == MemoryChunk::FromAddress(a)) return true; |
} |
return false; |
} |
@@ -406,40 +358,33 @@ void Page::ClearEvacuationCandidate() { |
} |
MemoryChunkIterator::MemoryChunkIterator(Heap* heap) |
- : state_(kOldSpaceState), |
- old_iterator_(heap->old_space()), |
- code_iterator_(heap->code_space()), |
- map_iterator_(heap->map_space()), |
- lo_iterator_(heap->lo_space()) {} |
+ : heap_(heap), |
+ state_(kOldSpaceState), |
+ old_iterator_(heap->old_space()->begin()), |
+ code_iterator_(heap->code_space()->begin()), |
+ map_iterator_(heap->map_space()->begin()), |
+ lo_iterator_(heap->lo_space()->begin()) {} |
MemoryChunk* MemoryChunkIterator::next() { |
switch (state_) { |
case kOldSpaceState: { |
- if (old_iterator_.has_next()) { |
- return old_iterator_.next(); |
- } |
+ if (old_iterator_ != heap_->old_space()->end()) return *(old_iterator_++); |
state_ = kMapState; |
// Fall through. |
} |
case kMapState: { |
- if (map_iterator_.has_next()) { |
- return map_iterator_.next(); |
- } |
+ if (map_iterator_ != heap_->map_space()->end()) return *(map_iterator_++); |
state_ = kCodeState; |
// Fall through. |
} |
case kCodeState: { |
- if (code_iterator_.has_next()) { |
- return code_iterator_.next(); |
- } |
+ if (code_iterator_ != heap_->code_space()->end()) |
+ return *(code_iterator_++); |
state_ = kLargeObjectState; |
// Fall through. |
} |
case kLargeObjectState: { |
- MemoryChunk* answer = lo_iterator_.next(); |
- if (answer != nullptr) { |
- return answer; |
- } |
+ if (lo_iterator_ != heap_->lo_space()->end()) return *(lo_iterator_++); |
state_ = kFinishedState; |
// Fall through; |
} |