Index: src/heap/spaces-inl.h |
diff --git a/src/heap/spaces-inl.h b/src/heap/spaces-inl.h |
index 1567a8790d26ce5d0c88bd86847299cca5985fdf..eefbc711757b2d106e824986e6f411d3c652e8c9 100644 |
--- a/src/heap/spaces-inl.h |
+++ b/src/heap/spaces-inl.h |
@@ -28,10 +28,14 @@ PageIteratorImpl<PAGE_TYPE> PageIteratorImpl<PAGE_TYPE>::operator++(int) { |
return tmp; |
} |
-NewSpacePageRange::NewSpacePageRange(Address start, Address limit) |
- : range_(Page::FromAddress(start), |
- Page::FromAllocationAreaAddress(limit)->next_page()) { |
- SemiSpace::AssertValidRange(start, limit); |
+PageRange::PageRange(Address start, Address limit) |
+ : begin_(Page::FromAllocationAreaAddress(start)), |
+ end_(Page::FromAllocationAreaAddress(limit)->next_page()) { |
+#ifdef DEBUG |
+ if (begin_->InNewSpace()) { |
+ SemiSpace::AssertValidRange(start, limit); |
+ } |
+#endif // DEBUG |
} |
// ----------------------------------------------------------------------------- |
@@ -68,8 +72,14 @@ HeapObject* HeapObjectIterator::Next() { |
HeapObject* HeapObjectIterator::FromCurrentPage() { |
while (cur_addr_ != cur_end_) { |
- if (cur_addr_ == space_->top() && cur_addr_ != space_->limit()) { |
- cur_addr_ = space_->limit(); |
+ // When the current address equals top we have to handle two scenarios: |
+ // - Old space page: Move forward to limit if top != limit. We will find |
+ // a filler following limit. |
+ // - New space page: We have to stop iteration before the linear allocation |
+ // area as there are no fillers behind it. |
+ if (cur_addr_ == space_->top() && |
+ (cur_addr_ != space_->limit() || current_page()->InNewSpace())) { |
+ cur_addr_ = current_page()->InNewSpace() ? cur_end_ : space_->limit(); |
continue; |
} |
HeapObject* obj = HeapObject::FromAddress(cur_addr_); |
@@ -79,7 +89,7 @@ HeapObject* HeapObjectIterator::FromCurrentPage() { |
if (!obj->IsFiller()) { |
if (obj->IsCode()) { |
DCHECK_EQ(space_, space_->heap()->code_space()); |
- DCHECK_CODEOBJECT_SIZE(obj_size, space_); |
+ DCHECK_CODEOBJECT_SIZE(obj_size, reinterpret_cast<PagedSpace*>(space_)); |
} else { |
DCHECK_OBJECT_SIZE(obj_size); |
} |