Index: src/store-buffer.cc |
diff --git a/src/store-buffer.cc b/src/store-buffer.cc |
index 027c2f39eaaa954f700e9a715f512478275efe8f..18e972185d81c72ec48bf5821356e77683796471 100644 |
--- a/src/store-buffer.cc |
+++ b/src/store-buffer.cc |
@@ -555,13 +555,9 @@ void StoreBuffer::FindPointersToNewSpaceOnPage( |
} |
- |
-void StoreBuffer::IteratePointersToNewSpace(ObjectSlotCallback slot_callback) { |
- // We do not sort or remove duplicated entries from the store buffer because |
- // we expect that callback will rebuild the store buffer thus removing |
- // all duplicates and pointers to old space. |
- bool some_pages_to_scan = PrepareForIteration(); |
- |
+template<StoreBuffer::IterationMode mode> |
+void StoreBuffer::IteratePointersInStoreBuffer( |
+ ObjectSlotCallback slot_callback) { |
Address* limit = old_top_; |
old_top_ = old_start_; |
{ |
@@ -571,6 +567,11 @@ void StoreBuffer::IteratePointersToNewSpace(ObjectSlotCallback slot_callback) { |
Address* saved_top = old_top_; |
#endif |
Object** slot = reinterpret_cast<Object**>(*current); |
+ |
+ // TODO(gc): we want to skip slots on evacuation candidates |
+ // but we can't simply figure that out from slot address |
+ // because slot can belong to a large object. |
Erik Corry
2011/06/20 20:41:26
Pity. I was looking forward to seeing how you wou
|
+ |
Object* object = *slot; |
if (heap_->InFromSpace(object)) { |
HeapObject* heap_object = reinterpret_cast<HeapObject*>(object); |
@@ -582,6 +583,26 @@ void StoreBuffer::IteratePointersToNewSpace(ObjectSlotCallback slot_callback) { |
ASSERT(old_top_ == saved_top + 1 || old_top_ == saved_top); |
} |
} |
+ |
Erik Corry
2011/06/20 20:41:26
Spurious blank line.
Vyacheslav Egorov (Chromium)
2011/06/21 11:44:48
Done.
|
+} |
+ |
+ |
+void StoreBuffer::IteratePointersToNewSpace(ObjectSlotCallback slot_callback, |
+ IterationMode mode) { |
+ // We do not sort or remove duplicated entries from the store buffer because |
+ // we expect that callback will rebuild the store buffer thus removing |
+ // all duplicates and pointers to old space. |
+ bool some_pages_to_scan = PrepareForIteration(); |
+ |
+ if (mode == SKIP_SLOTS_IN_EVACUATION_CANDIDATES) { |
+ IteratePointersInStoreBuffer<SKIP_SLOTS_IN_EVACUATION_CANDIDATES>( |
+ slot_callback); |
+ } else { |
+ ASSERT(mode == VISIT_ALL_SLOTS); |
+ IteratePointersInStoreBuffer<VISIT_ALL_SLOTS>(slot_callback); |
+ } |
+ |
+ |
// We are done scanning all the pointers that were in the store buffer, but |
// there may be some pages marked scan_on_scavenge that have pointers to new |
// space that are not in the store buffer. We must scan them now. As we |