| 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;
 | 
|      }
 | 
| 
 |