| Index: src/heap/mark-compact.cc
|
| diff --git a/src/heap/mark-compact.cc b/src/heap/mark-compact.cc
|
| index 35ae1bdf3601d6efb2770490be766a2e5373a2c5..6f81bebb1feaf55e22d37c8291eb94b163e5a902 100644
|
| --- a/src/heap/mark-compact.cc
|
| +++ b/src/heap/mark-compact.cc
|
| @@ -137,6 +137,7 @@
|
| static void VerifyMarking(Heap* heap) {
|
| VerifyMarking(heap->old_space());
|
| VerifyMarking(heap->code_space());
|
| + VerifyMarking(heap->cell_space());
|
| VerifyMarking(heap->map_space());
|
| VerifyMarking(heap->new_space());
|
|
|
| @@ -214,6 +215,7 @@
|
| static void VerifyEvacuation(Heap* heap) {
|
| VerifyEvacuation(heap, heap->old_space());
|
| VerifyEvacuation(heap, heap->code_space());
|
| + VerifyEvacuation(heap, heap->cell_space());
|
| VerifyEvacuation(heap, heap->map_space());
|
| VerifyEvacuation(heap->new_space());
|
|
|
| @@ -266,6 +268,7 @@
|
|
|
| if (FLAG_trace_fragmentation) {
|
| TraceFragmentation(heap()->map_space());
|
| + TraceFragmentation(heap()->cell_space());
|
| }
|
|
|
| heap()->old_space()->EvictEvacuationCandidatesFromFreeLists();
|
| @@ -292,6 +295,7 @@
|
|
|
| ClearInvalidSlotsBufferEntries(heap_->old_space());
|
| ClearInvalidSlotsBufferEntries(heap_->code_space());
|
| + ClearInvalidSlotsBufferEntries(heap_->cell_space());
|
| ClearInvalidSlotsBufferEntries(heap_->map_space());
|
|
|
| LargeObjectIterator it(heap_->lo_space());
|
| @@ -317,6 +321,7 @@
|
|
|
| VerifyValidSlotsBufferEntries(heap, heap->old_space());
|
| VerifyValidSlotsBufferEntries(heap, heap->code_space());
|
| + VerifyValidSlotsBufferEntries(heap, heap->cell_space());
|
| VerifyValidSlotsBufferEntries(heap, heap->map_space());
|
|
|
| LargeObjectIterator it(heap->lo_space());
|
| @@ -407,6 +412,7 @@
|
| void MarkCompactCollector::VerifyMarkbitsAreClean() {
|
| VerifyMarkbitsAreClean(heap_->old_space());
|
| VerifyMarkbitsAreClean(heap_->code_space());
|
| + VerifyMarkbitsAreClean(heap_->cell_space());
|
| VerifyMarkbitsAreClean(heap_->map_space());
|
| VerifyMarkbitsAreClean(heap_->new_space());
|
|
|
| @@ -463,6 +469,7 @@
|
| ClearMarkbitsInPagedSpace(heap_->code_space());
|
| ClearMarkbitsInPagedSpace(heap_->map_space());
|
| ClearMarkbitsInPagedSpace(heap_->old_space());
|
| + ClearMarkbitsInPagedSpace(heap_->cell_space());
|
| ClearMarkbitsInNewSpace(heap_->new_space());
|
|
|
| LargeObjectIterator it(heap_->lo_space());
|
| @@ -606,6 +613,8 @@
|
| return "CODE_SPACE";
|
| case MAP_SPACE:
|
| return "MAP_SPACE";
|
| + case CELL_SPACE:
|
| + return "CELL_SPACE";
|
| case LO_SPACE:
|
| return "LO_SPACE";
|
| default:
|
| @@ -2084,6 +2093,9 @@
|
| DiscoverGreyObjectsInSpace(heap(), &marking_deque_, heap()->map_space());
|
| if (marking_deque_.IsFull()) return;
|
|
|
| + DiscoverGreyObjectsInSpace(heap(), &marking_deque_, heap()->cell_space());
|
| + if (marking_deque_.IsFull()) return;
|
| +
|
| LargeObjectIterator lo_it(heap()->lo_space());
|
| DiscoverGreyObjectsWithIterator(heap(), &marking_deque_, &lo_it);
|
| if (marking_deque_.IsFull()) return;
|
| @@ -2273,6 +2285,23 @@
|
| EnsureMarkingDequeIsCommittedAndInitialize();
|
|
|
| PrepareForCodeFlushing();
|
| +
|
| + if (was_marked_incrementally_) {
|
| + // There is no write barrier on cells so we have to scan them now at the end
|
| + // of the incremental marking.
|
| + {
|
| + HeapObjectIterator cell_iterator(heap()->cell_space());
|
| + HeapObject* cell;
|
| + while ((cell = cell_iterator.Next()) != NULL) {
|
| + DCHECK(cell->IsCell());
|
| + if (IsMarked(cell)) {
|
| + int offset = Cell::kValueOffset;
|
| + MarkCompactMarkingVisitor::VisitPointer(
|
| + heap(), reinterpret_cast<Object**>(cell->address() + offset));
|
| + }
|
| + }
|
| + }
|
| + }
|
|
|
| RootMarkingVisitor root_visitor(heap());
|
| MarkRoots(&root_visitor);
|
| @@ -2826,16 +2855,6 @@
|
| for (Object** p = start; p < end; p++) UpdatePointer(p);
|
| }
|
|
|
| - void VisitCell(RelocInfo* rinfo) {
|
| - DCHECK(rinfo->rmode() == RelocInfo::CELL);
|
| - Object* cell = rinfo->target_cell();
|
| - Object* old_cell = cell;
|
| - VisitPointer(&cell);
|
| - if (cell != old_cell) {
|
| - rinfo->set_target_cell(reinterpret_cast<Cell*>(cell));
|
| - }
|
| - }
|
| -
|
| void VisitEmbeddedPointer(RelocInfo* rinfo) {
|
| DCHECK(rinfo->rmode() == RelocInfo::EMBEDDED_OBJECT);
|
| Object* target = rinfo->target_object();
|
| @@ -2944,9 +2963,11 @@
|
| space_owner_id = 4;
|
| } else if (heap->map_space()->ContainsSafe(slot_address)) {
|
| space_owner_id = 5;
|
| + } else if (heap->cell_space()->ContainsSafe(slot_address)) {
|
| + space_owner_id = 6;
|
| } else {
|
| // Lo space or other.
|
| - space_owner_id = 6;
|
| + space_owner_id = 7;
|
| }
|
| data[index++] = space_owner_id;
|
| data[index++] = 0x20aaaaaaaaUL;
|
| @@ -3374,11 +3395,6 @@
|
| rinfo.Visit(isolate, v);
|
| break;
|
| }
|
| - case SlotsBuffer::CELL_TARGET_SLOT: {
|
| - RelocInfo rinfo(addr, RelocInfo::CELL, 0, NULL);
|
| - rinfo.Visit(isolate, v);
|
| - break;
|
| - }
|
| case SlotsBuffer::CODE_ENTRY_SLOT: {
|
| v->VisitCodeEntry(addr);
|
| break;
|
| @@ -3775,6 +3791,15 @@
|
|
|
| GCTracer::Scope gc_scope(heap()->tracer(),
|
| GCTracer::Scope::MC_UPDATE_MISC_POINTERS);
|
| +
|
| + // Update pointers from cells.
|
| + HeapObjectIterator cell_iterator(heap_->cell_space());
|
| + for (HeapObject* cell = cell_iterator.Next(); cell != NULL;
|
| + cell = cell_iterator.Next()) {
|
| + if (cell->IsCell()) {
|
| + Cell::BodyDescriptor::IterateBody(cell, &updating_visitor);
|
| + }
|
| + }
|
|
|
| heap_->string_table()->Iterate(&updating_visitor);
|
|
|
| @@ -4390,6 +4415,12 @@
|
| SweepSpace(heap()->code_space(), SEQUENTIAL_SWEEPING);
|
| }
|
|
|
| + {
|
| + GCTracer::Scope sweep_scope(heap()->tracer(),
|
| + GCTracer::Scope::MC_SWEEP_CELL);
|
| + SweepSpace(heap()->cell_space(), SEQUENTIAL_SWEEPING);
|
| + }
|
| +
|
| EvacuateNewSpaceAndCandidates();
|
|
|
| // ClearNonLiveReferences depends on precise sweeping of map space to
|
| @@ -4568,8 +4599,6 @@
|
| static inline SlotsBuffer::SlotType SlotTypeForRMode(RelocInfo::Mode rmode) {
|
| if (RelocInfo::IsCodeTarget(rmode)) {
|
| return SlotsBuffer::CODE_TARGET_SLOT;
|
| - } else if (RelocInfo::IsCell(rmode)) {
|
| - return SlotsBuffer::CELL_TARGET_SLOT;
|
| } else if (RelocInfo::IsEmbeddedObject(rmode)) {
|
| return SlotsBuffer::EMBEDDED_OBJECT_SLOT;
|
| } else if (RelocInfo::IsDebugBreakSlot(rmode)) {
|
|
|