Index: src/heap/remembered-set.cc |
diff --git a/src/heap/remembered-set.cc b/src/heap/remembered-set.cc |
index c5dab905159b33be62906139efb79b64209ee46e..4e621611ac817abc6d356bba7e237f939014b4a8 100644 |
--- a/src/heap/remembered-set.cc |
+++ b/src/heap/remembered-set.cc |
@@ -15,93 +15,55 @@ namespace v8 { |
namespace internal { |
template <PointerDirection direction> |
-void RememberedSet<direction>::ClearInvalidSlots(Heap* heap) { |
+void RememberedSet<direction>::ClearInvalidSlots(Heap* heap, |
+ MemoryChunk* chunk) { |
STATIC_ASSERT(direction == OLD_TO_NEW); |
- for (MemoryChunk* chunk : *heap->old_space()) { |
- SlotSet* slots = GetSlotSet(chunk); |
- if (slots != nullptr) { |
- slots->Iterate( |
- [heap, chunk](Address addr) { |
- Object** slot = reinterpret_cast<Object**>(addr); |
- return IsValidSlot(heap, chunk, slot) ? KEEP_SLOT : REMOVE_SLOT; |
- }, |
- SlotSet::PREFREE_EMPTY_BUCKETS); |
- } |
- } |
- for (MemoryChunk* chunk : *heap->code_space()) { |
- TypedSlotSet* slots = GetTypedSlotSet(chunk); |
- if (slots != nullptr) { |
- slots->Iterate( |
- [heap, chunk](SlotType type, Address host_addr, Address addr) { |
- if (Marking::IsBlack(ObjectMarking::MarkBitFrom(host_addr))) { |
- return KEEP_SLOT; |
- } else { |
- return REMOVE_SLOT; |
- } |
- }, |
- TypedSlotSet::PREFREE_EMPTY_CHUNKS); |
- } |
- } |
- for (MemoryChunk* chunk : *heap->map_space()) { |
- SlotSet* slots = GetSlotSet(chunk); |
- if (slots != nullptr) { |
- slots->Iterate( |
- [heap, chunk](Address addr) { |
- Object** slot = reinterpret_cast<Object**>(addr); |
- // TODO(mlippautz): In map space all allocations would ideally be |
- // map |
- // aligned. After establishing this invariant IsValidSlot could just |
- // refer to the containing object using alignment and check the mark |
- // bits. |
- return IsValidSlot(heap, chunk, slot) ? KEEP_SLOT : REMOVE_SLOT; |
- }, |
- SlotSet::PREFREE_EMPTY_BUCKETS); |
- } |
+ DCHECK(chunk->owner()->identity() == OLD_SPACE || |
+ chunk->owner()->identity() == MAP_SPACE); |
+ SlotSet* slots = GetSlotSet(chunk); |
+ if (slots != nullptr) { |
+ slots->Iterate( |
+ [heap, chunk](Address addr) { |
+ Object** slot = reinterpret_cast<Object**>(addr); |
+ return IsValidSlot(heap, chunk, slot) ? KEEP_SLOT : REMOVE_SLOT; |
+ }, |
+ SlotSet::KEEP_EMPTY_BUCKETS); |
} |
} |
template <PointerDirection direction> |
-void RememberedSet<direction>::VerifyValidSlots(Heap* heap) { |
- Iterate(heap, [heap](Address addr) { |
- HeapObject* obj = |
- heap->mark_compact_collector()->FindBlackObjectBySlotSlow(addr); |
- if (obj == nullptr) { |
- // The slot is in dead object. |
- MemoryChunk* chunk = MemoryChunk::FromAnyPointerAddress(heap, addr); |
- AllocationSpace owner = chunk->owner()->identity(); |
- // The old to old remembered set should not have dead slots. |
- CHECK_NE(direction, OLD_TO_OLD); |
- // The old to new remembered set is allowed to have slots in dead |
- // objects only in map and large object space because these space |
- // cannot have raw untagged pointers. |
- CHECK(owner == MAP_SPACE || owner == LO_SPACE); |
- } else { |
- int offset = static_cast<int>(addr - obj->address()); |
- CHECK(obj->IsValidSlot(offset)); |
- } |
- return KEEP_SLOT; |
- }); |
+void RememberedSet<direction>::ClearInvalidTypedSlots(Heap* heap, |
+ MemoryChunk* chunk) { |
+ STATIC_ASSERT(direction == OLD_TO_NEW); |
+ DCHECK(chunk->owner()->identity() == CODE_SPACE); |
+ TypedSlotSet* slots = GetTypedSlotSet(chunk); |
+ if (slots != nullptr) { |
+ slots->Iterate( |
+ [heap, chunk](SlotType type, Address host_addr, Address addr) { |
+ if (Marking::IsBlack(ObjectMarking::MarkBitFrom(host_addr))) { |
+ return KEEP_SLOT; |
+ } else { |
+ return REMOVE_SLOT; |
+ } |
+ }, |
+ TypedSlotSet::KEEP_EMPTY_CHUNKS); |
+ } |
} |
template <PointerDirection direction> |
bool RememberedSet<direction>::IsValidSlot(Heap* heap, MemoryChunk* chunk, |
Object** slot) { |
STATIC_ASSERT(direction == OLD_TO_NEW); |
- Object* object = *slot; |
- if (!heap->InNewSpace(object)) { |
- return false; |
- } |
- HeapObject* heap_object = HeapObject::cast(object); |
// If the target object is not black, the source slot must be part |
// of a non-black (dead) object. |
- return Marking::IsBlack(ObjectMarking::MarkBitFrom(heap_object)) && |
- heap->mark_compact_collector()->IsSlotInBlackObject( |
- chunk, reinterpret_cast<Address>(slot)); |
+ return heap->mark_compact_collector()->IsSlotInBlackObject( |
+ chunk, reinterpret_cast<Address>(slot)); |
} |
-template void RememberedSet<OLD_TO_NEW>::ClearInvalidSlots(Heap* heap); |
-template void RememberedSet<OLD_TO_NEW>::VerifyValidSlots(Heap* heap); |
-template void RememberedSet<OLD_TO_OLD>::VerifyValidSlots(Heap* heap); |
+template void RememberedSet<OLD_TO_NEW>::ClearInvalidSlots(Heap* heap, |
+ MemoryChunk* chunk); |
+template void RememberedSet<OLD_TO_NEW>::ClearInvalidTypedSlots( |
+ Heap* heap, MemoryChunk* chunk); |
} // namespace internal |
} // namespace v8 |