| // Copyright 2016 the V8 project authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "src/heap/remembered-set.h" |
| #include "src/heap/heap-inl.h" |
| #include "src/heap/heap.h" |
| #include "src/heap/mark-compact.h" |
| #include "src/heap/slot-set.h" |
| #include "src/heap/spaces.h" |
| #include "src/heap/store-buffer.h" |
| #include "src/macro-assembler.h" |
| |
| namespace v8 { |
| namespace internal { |
| |
| template <PointerDirection direction> |
| void RememberedSet<direction>::ClearInvalidSlots(Heap* heap, |
| MemoryChunk* chunk) { |
| STATIC_ASSERT(direction == OLD_TO_NEW); |
| 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>::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); |
| // If the target object is not black, the source slot must be part |
| // of a non-black (dead) object. |
| return heap->mark_compact_collector()->IsSlotInBlackObject( |
| chunk, reinterpret_cast<Address>(slot)); |
| } |
| |
| 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 |