| Index: src/heap/heap.cc
|
| diff --git a/src/heap/heap.cc b/src/heap/heap.cc
|
| index 713cda82f57b786da7ac63195b81969cd715cbc9..9ffeac4d3822cbbbefd1d94262c4e1a85a81ceb0 100644
|
| --- a/src/heap/heap.cc
|
| +++ b/src/heap/heap.cc
|
| @@ -27,6 +27,7 @@
|
| #include "src/heap/object-stats.h"
|
| #include "src/heap/objects-visiting-inl.h"
|
| #include "src/heap/objects-visiting.h"
|
| +#include "src/heap/remembered-set.h"
|
| #include "src/heap/scavenge-job.h"
|
| #include "src/heap/scavenger-inl.h"
|
| #include "src/heap/store-buffer.h"
|
| @@ -462,6 +463,7 @@ void Heap::GarbageCollectionPrologue() {
|
| }
|
| CheckNewSpaceExpansionCriteria();
|
| UpdateNewSpaceAllocationCounter();
|
| + store_buffer()->MoveEntriesToRememberedSet();
|
| }
|
|
|
|
|
| @@ -1678,7 +1680,8 @@ void Heap::Scavenge() {
|
| // Copy objects reachable from the old generation.
|
| GCTracer::Scope gc_scope(tracer(),
|
| GCTracer::Scope::SCAVENGER_OLD_TO_NEW_POINTERS);
|
| - store_buffer()->IteratePointersToNewSpace(&Scavenger::ScavengeObject);
|
| + RememberedSet<OLD_TO_NEW>::IterateWithWrapper(this,
|
| + Scavenger::ScavengeObject);
|
| }
|
|
|
| {
|
| @@ -4433,8 +4436,6 @@ void Heap::Verify() {
|
| CHECK(HasBeenSetUp());
|
| HandleScope scope(isolate());
|
|
|
| - store_buffer()->Verify();
|
| -
|
| if (mark_compact_collector()->sweeping_in_progress()) {
|
| // We have to wait here for the sweeper threads to have an iterable heap.
|
| mark_compact_collector()->EnsureSweepingCompleted();
|
| @@ -4482,6 +4483,7 @@ void Heap::IterateAndMarkPointersToFromSpace(HeapObject* object, Address start,
|
| Address end, bool record_slots,
|
| ObjectSlotCallback callback) {
|
| Address slot_address = start;
|
| + Page* page = Page::FromAddress(start);
|
|
|
| while (slot_address < end) {
|
| Object** slot = reinterpret_cast<Object**>(slot_address);
|
| @@ -4498,7 +4500,7 @@ void Heap::IterateAndMarkPointersToFromSpace(HeapObject* object, Address start,
|
| if (InNewSpace(new_target)) {
|
| SLOW_DCHECK(Heap::InToSpace(new_target));
|
| SLOW_DCHECK(new_target->IsHeapObject());
|
| - store_buffer_.Mark(reinterpret_cast<Address>(slot));
|
| + RememberedSet<OLD_TO_NEW>::Insert(page, slot_address);
|
| }
|
| SLOW_DCHECK(!MarkCompactCollector::IsOnEvacuationCandidate(new_target));
|
| } else if (record_slots &&
|
| @@ -5478,7 +5480,11 @@ void Heap::CheckHandleCount() {
|
|
|
| void Heap::ClearRecordedSlot(HeapObject* object, Object** slot) {
|
| if (!InNewSpace(object)) {
|
| - store_buffer()->Remove(reinterpret_cast<Address>(slot));
|
| + store_buffer()->MoveEntriesToRememberedSet();
|
| + Address slot_addr = reinterpret_cast<Address>(slot);
|
| + Page* page = Page::FromAddress(slot_addr);
|
| + DCHECK_EQ(page->owner()->identity(), OLD_SPACE);
|
| + RememberedSet<OLD_TO_NEW>::Remove(page, slot_addr);
|
| }
|
| }
|
|
|
|
|