Chromium Code Reviews| 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 |