Index: src/heap/store-buffer.cc |
diff --git a/src/heap/store-buffer.cc b/src/heap/store-buffer.cc |
index 048b49f10ff29153c3b68a727552ba8fd3f0193c..ebc513a4fc7619719e079c4f1715e5d7ce327e55 100644 |
--- a/src/heap/store-buffer.cc |
+++ b/src/heap/store-buffer.cc |
@@ -412,6 +412,26 @@ void StoreBuffer::VerifyValidStoreBufferEntries() { |
} |
+class FindPointersToNewSpaceVisitor final : public ObjectVisitor { |
+ public: |
+ FindPointersToNewSpaceVisitor(StoreBuffer* store_buffer, |
+ ObjectSlotCallback callback) |
+ : store_buffer_(store_buffer), callback_(callback) {} |
+ |
+ V8_INLINE void VisitPointers(Object** start, Object** end) override { |
+ store_buffer_->FindPointersToNewSpaceInRegion( |
+ reinterpret_cast<Address>(start), reinterpret_cast<Address>(end), |
+ callback_); |
+ } |
+ |
+ V8_INLINE void VisitCodeEntry(Address code_entry_slot) override {} |
+ |
+ private: |
+ StoreBuffer* store_buffer_; |
+ ObjectSlotCallback callback_; |
+}; |
+ |
+ |
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 |
@@ -438,6 +458,7 @@ void StoreBuffer::IteratePointersToNewSpace(ObjectSlotCallback slot_callback) { |
} |
PointerChunkIterator it(heap_); |
MemoryChunk* chunk; |
+ FindPointersToNewSpaceVisitor visitor(this, slot_callback); |
while ((chunk = it.next()) != NULL) { |
if (chunk->scan_on_scavenge()) { |
chunk->set_scan_on_scavenge(false); |
@@ -475,63 +496,7 @@ void StoreBuffer::IteratePointersToNewSpace(ObjectSlotCallback slot_callback) { |
for (HeapObject* heap_object = iterator.Next(); heap_object != NULL; |
heap_object = iterator.Next()) { |
// We iterate over objects that contain new space pointers only. |
- Address obj_address = heap_object->address(); |
- const int start_offset = HeapObject::kHeaderSize; |
- const int end_offset = heap_object->Size(); |
- |
- switch (heap_object->ContentType()) { |
- case HeapObjectContents::kTaggedValues: { |
- Address start_address = obj_address + start_offset; |
- Address end_address = obj_address + end_offset; |
- // Object has only tagged fields. |
- FindPointersToNewSpaceInRegion(start_address, end_address, |
- slot_callback); |
- break; |
- } |
- |
- case HeapObjectContents::kMixedValues: { |
- if (heap_object->IsFixedTypedArrayBase()) { |
- FindPointersToNewSpaceInRegion( |
- obj_address + FixedTypedArrayBase::kBasePointerOffset, |
- obj_address + FixedTypedArrayBase::kHeaderSize, |
- slot_callback); |
- } else if (heap_object->IsBytecodeArray()) { |
- FindPointersToNewSpaceInRegion( |
- obj_address + BytecodeArray::kConstantPoolOffset, |
- obj_address + BytecodeArray::kHeaderSize, |
- slot_callback); |
- } else if (heap_object->IsJSArrayBuffer()) { |
- FindPointersToNewSpaceInRegion( |
- obj_address + JSArrayBuffer::kPropertiesOffset, |
- obj_address + JSArrayBuffer::kByteLengthOffset + |
- kPointerSize, |
- slot_callback); |
- FindPointersToNewSpaceInRegion( |
- obj_address + JSArrayBuffer::kSize, |
- obj_address + JSArrayBuffer::kSizeWithInternalFields, |
- slot_callback); |
- } else if (FLAG_unbox_double_fields) { |
- LayoutDescriptorHelper helper(heap_object->map()); |
- DCHECK(!helper.all_fields_tagged()); |
- for (int offset = start_offset; offset < end_offset;) { |
- int end_of_region_offset; |
- if (helper.IsTagged(offset, end_offset, |
- &end_of_region_offset)) { |
- FindPointersToNewSpaceInRegion( |
- obj_address + offset, |
- obj_address + end_of_region_offset, slot_callback); |
- } |
- offset = end_of_region_offset; |
- } |
- } else { |
- UNREACHABLE(); |
- } |
- break; |
- } |
- |
- case HeapObjectContents::kRawValues: |
- break; |
- } |
+ heap_object->IterateBody(&visitor); |
} |
} |
} |