Index: src/store-buffer.cc |
diff --git a/src/store-buffer.cc b/src/store-buffer.cc |
index b0f7d2f80309a67fe35faeb7d39d8d6e0362abed..547359a09d50d8a33c70b73fdb3e3b3085480572 100644 |
--- a/src/store-buffer.cc |
+++ b/src/store-buffer.cc |
@@ -332,27 +332,6 @@ void StoreBuffer::GCPrologue() { |
#ifdef VERIFY_HEAP |
-static void DummyScavengePointer(HeapObject** p, HeapObject* o) { |
- // Do nothing. |
-} |
- |
- |
-void StoreBuffer::VerifyPointers(PagedSpace* space, |
- RegionCallback region_callback) { |
- PageIterator it(space); |
- |
- while (it.has_next()) { |
- Page* page = it.next(); |
- FindPointersToNewSpaceOnPage( |
- reinterpret_cast<PagedSpace*>(page->owner()), |
- page, |
- region_callback, |
- &DummyScavengePointer, |
- false); |
- } |
-} |
- |
- |
void StoreBuffer::VerifyPointers(LargeObjectSpace* space) { |
LargeObjectIterator it(space); |
for (HeapObject* object = it.Next(); object != NULL; object = it.Next()) { |
@@ -378,10 +357,6 @@ void StoreBuffer::VerifyPointers(LargeObjectSpace* space) { |
void StoreBuffer::Verify() { |
#ifdef VERIFY_HEAP |
- VerifyPointers(heap_->old_pointer_space(), |
- &StoreBuffer::FindPointersToNewSpaceInRegion); |
- VerifyPointers(heap_->map_space(), |
- &StoreBuffer::FindPointersToNewSpaceInMapsRegion); |
VerifyPointers(heap_->lo_space()); |
#endif |
} |
@@ -482,94 +457,6 @@ void StoreBuffer::FindPointersToNewSpaceInMapsRegion( |
} |
-// This function iterates over all the pointers in a paged space in the heap, |
-// looking for pointers into new space. Within the pages there may be dead |
-// objects that have not been overwritten by free spaces or fillers because of |
-// concurrent sweeping. These dead objects may not contain pointers to new |
-// space. The garbage areas that have been swept properly (these will normally |
-// be the large ones) will be marked with free space and filler map words. In |
-// addition any area that has never been used at all for object allocation must |
-// be marked with a free space or filler. Because the free space and filler |
-// maps do not move we can always recognize these even after a compaction. |
-// Normal objects like FixedArrays and JSObjects should not contain references |
-// to these maps. Constant pool array objects may contain references to these |
-// maps, however, constant pool arrays cannot contain pointers to new space |
-// objects, therefore they are skipped. The special garbage section (see |
-// comment in spaces.h) is skipped since it can contain absolutely anything. |
-// Any objects that are allocated during iteration may or may not be visited by |
-// the iteration, but they will not be partially visited. |
-void StoreBuffer::FindPointersToNewSpaceOnPage( |
- PagedSpace* space, |
- Page* page, |
- RegionCallback region_callback, |
- ObjectSlotCallback slot_callback, |
- bool clear_maps) { |
- Address visitable_start = page->area_start(); |
- Address end_of_page = page->area_end(); |
- |
- Address visitable_end = visitable_start; |
- |
- Object* free_space_map = heap_->free_space_map(); |
- Object* two_pointer_filler_map = heap_->two_pointer_filler_map(); |
- Object* constant_pool_array_map = heap_->constant_pool_array_map(); |
- |
- while (visitable_end < end_of_page) { |
- // The sweeper thread concurrently may write free space maps and size to |
- // this page. We need acquire load here to make sure that we get a |
- // consistent view of maps and their sizes. |
- Object* o = reinterpret_cast<Object*>( |
- Acquire_Load(reinterpret_cast<AtomicWord*>(visitable_end))); |
- // Skip fillers or constant pool arrays (which never contain new-space |
- // pointers but can contain pointers which can be confused for fillers) |
- // but not things that look like fillers in the special garbage section |
- // which can contain anything. |
- if (o == free_space_map || |
- o == two_pointer_filler_map || |
- o == constant_pool_array_map || |
- (visitable_end == space->top() && visitable_end != space->limit())) { |
- if (visitable_start != visitable_end) { |
- // After calling this the special garbage section may have moved. |
- (this->*region_callback)(visitable_start, |
- visitable_end, |
- slot_callback, |
- clear_maps); |
- if (visitable_end >= space->top() && visitable_end < space->limit()) { |
- visitable_end = space->limit(); |
- visitable_start = visitable_end; |
- continue; |
- } |
- } |
- if (visitable_end == space->top() && visitable_end != space->limit()) { |
- visitable_start = visitable_end = space->limit(); |
- } else { |
- // At this point we are either at the start of a filler, a |
- // constant pool array, or we are at the point where the space->top() |
- // used to be before the visit_pointer_region call above. Either way we |
- // can skip the object at the current spot: We don't promise to visit |
- // objects allocated during heap traversal, and if space->top() moved |
- // then it must be because an object was allocated at this point. |
- visitable_start = |
- visitable_end + HeapObject::FromAddress(visitable_end)->Size(); |
- visitable_end = visitable_start; |
- } |
- } else { |
- ASSERT(o != free_space_map); |
- ASSERT(o != two_pointer_filler_map); |
- ASSERT(o != constant_pool_array_map); |
- ASSERT(visitable_end < space->top() || visitable_end >= space->limit()); |
- visitable_end += kPointerSize; |
- } |
- } |
- ASSERT(visitable_end == end_of_page); |
- if (visitable_start != visitable_end) { |
- (this->*region_callback)(visitable_start, |
- visitable_end, |
- slot_callback, |
- clear_maps); |
- } |
-} |
- |
- |
void StoreBuffer::IteratePointersInStoreBuffer( |
ObjectSlotCallback slot_callback, |
bool clear_maps) { |
@@ -656,14 +543,15 @@ void StoreBuffer::IteratePointersToNewSpace(ObjectSlotCallback slot_callback, |
} else { |
Page* page = reinterpret_cast<Page*>(chunk); |
PagedSpace* owner = reinterpret_cast<PagedSpace*>(page->owner()); |
- FindPointersToNewSpaceOnPage( |
- owner, |
- page, |
- (owner == heap_->map_space() ? |
- &StoreBuffer::FindPointersToNewSpaceInMapsRegion : |
- &StoreBuffer::FindPointersToNewSpaceInRegion), |
- slot_callback, |
- clear_maps); |
+ Address start = page->area_start(); |
+ Address end = page->area_end(); |
+ if (owner == heap_->map_space()) { |
+ FindPointersToNewSpaceInMapsRegion( |
+ start, end, slot_callback, clear_maps); |
+ } else { |
+ FindPointersToNewSpaceInRegion( |
+ start, end, slot_callback, clear_maps); |
+ } |
} |
} |
} |