Index: src/mark-compact.cc |
diff --git a/src/mark-compact.cc b/src/mark-compact.cc |
index 99c5b4864d3ed94cb37e5a113994bd35e4559acd..d180b190cb1fc133f36946ea533aceeb217c6ac2 100644 |
--- a/src/mark-compact.cc |
+++ b/src/mark-compact.cc |
@@ -148,6 +148,7 @@ static void VerifyMarking(Heap* heap) { |
VerifyMarking(heap->old_data_space()); |
VerifyMarking(heap->code_space()); |
VerifyMarking(heap->cell_space()); |
+ VerifyMarking(heap->property_cell_space()); |
VerifyMarking(heap->map_space()); |
VerifyMarking(heap->new_space()); |
@@ -229,6 +230,7 @@ static void VerifyEvacuation(Heap* heap) { |
VerifyEvacuation(heap->old_data_space()); |
VerifyEvacuation(heap->code_space()); |
VerifyEvacuation(heap->cell_space()); |
+ VerifyEvacuation(heap->property_cell_space()); |
VerifyEvacuation(heap->map_space()); |
VerifyEvacuation(heap->new_space()); |
@@ -283,7 +285,7 @@ class VerifyNativeContextSeparationVisitor: public ObjectVisitor { |
array->set_length(length); |
} |
break; |
- case JS_GLOBAL_PROPERTY_CELL_TYPE: |
+ case CELL_TYPE: |
case JS_PROXY_TYPE: |
case JS_VALUE_TYPE: |
case TYPE_FEEDBACK_INFO_TYPE: |
@@ -375,6 +377,7 @@ bool MarkCompactCollector::StartCompaction(CompactionMode mode) { |
if (FLAG_trace_fragmentation) { |
TraceFragmentation(heap()->map_space()); |
TraceFragmentation(heap()->cell_space()); |
+ TraceFragmentation(heap()->property_cell_space()); |
} |
heap()->old_pointer_space()->EvictEvacuationCandidatesFromFreeLists(); |
@@ -468,6 +471,7 @@ void MarkCompactCollector::VerifyMarkbitsAreClean() { |
VerifyMarkbitsAreClean(heap_->old_data_space()); |
VerifyMarkbitsAreClean(heap_->code_space()); |
VerifyMarkbitsAreClean(heap_->cell_space()); |
+ VerifyMarkbitsAreClean(heap_->property_cell_space()); |
VerifyMarkbitsAreClean(heap_->map_space()); |
VerifyMarkbitsAreClean(heap_->new_space()); |
@@ -529,6 +533,7 @@ void MarkCompactCollector::ClearMarkbits() { |
ClearMarkbitsInPagedSpace(heap_->old_pointer_space()); |
ClearMarkbitsInPagedSpace(heap_->old_data_space()); |
ClearMarkbitsInPagedSpace(heap_->cell_space()); |
+ ClearMarkbitsInPagedSpace(heap_->property_cell_space()); |
ClearMarkbitsInNewSpace(heap_->new_space()); |
LargeObjectIterator it(heap_->lo_space()); |
@@ -648,6 +653,8 @@ const char* AllocationSpaceName(AllocationSpace space) { |
case CODE_SPACE: return "CODE_SPACE"; |
case MAP_SPACE: return "MAP_SPACE"; |
case CELL_SPACE: return "CELL_SPACE"; |
+ case PROPERTY_CELL_SPACE: |
+ return "PROPERTY_CELL_SPACE"; |
case LO_SPACE: return "LO_SPACE"; |
default: |
UNREACHABLE(); |
@@ -2125,6 +2132,11 @@ void MarkCompactCollector::RefillMarkingDeque() { |
heap()->cell_space()); |
if (marking_deque_.IsFull()) return; |
+ DiscoverGreyObjectsInSpace(heap(), |
+ &marking_deque_, |
+ heap()->property_cell_space()); |
+ if (marking_deque_.IsFull()) return; |
+ |
LargeObjectIterator lo_it(heap()->lo_space()); |
DiscoverGreyObjectsWithIterator(heap(), |
&marking_deque_, |
@@ -2218,12 +2230,30 @@ void MarkCompactCollector::MarkLiveObjects() { |
HeapObjectIterator cell_iterator(heap()->cell_space()); |
HeapObject* cell; |
while ((cell = cell_iterator.Next()) != NULL) { |
+ ASSERT(cell->IsCell()); |
+ if (IsMarked(cell)) { |
+ int offset = Cell::kValueOffset; |
+ MarkCompactMarkingVisitor::VisitPointer( |
+ heap(), |
+ reinterpret_cast<Object**>(cell->address() + offset)); |
+ } |
+ } |
+ } |
+ { |
+ HeapObjectIterator js_global_property_cell_iterator( |
+ heap()->property_cell_space()); |
+ HeapObject* cell; |
+ while ((cell = js_global_property_cell_iterator.Next()) != NULL) { |
ASSERT(cell->IsJSGlobalPropertyCell()); |
if (IsMarked(cell)) { |
int offset = JSGlobalPropertyCell::kValueOffset; |
MarkCompactMarkingVisitor::VisitPointer( |
heap(), |
reinterpret_cast<Object**>(cell->address() + offset)); |
+ offset = JSGlobalPropertyCell::kTypeOffset; |
+ MarkCompactMarkingVisitor::VisitPointer( |
+ heap(), |
+ reinterpret_cast<Object**>(cell->address() + offset)); |
} |
} |
} |
@@ -3363,11 +3393,27 @@ void MarkCompactCollector::EvacuateNewSpaceAndCandidates() { |
for (HeapObject* cell = cell_iterator.Next(); |
cell != NULL; |
cell = cell_iterator.Next()) { |
+ if (cell->IsCell()) { |
+ Address value_address = reinterpret_cast<Address>(cell) + |
+ (Cell::kValueOffset - kHeapObjectTag); |
+ updating_visitor.VisitPointer(reinterpret_cast<Object**>(value_address)); |
+ } |
+ } |
+ |
+ HeapObjectIterator js_global_property_cell_iterator( |
+ heap_->property_cell_space()); |
+ for (HeapObject* cell = js_global_property_cell_iterator.Next(); |
+ cell != NULL; |
+ cell = js_global_property_cell_iterator.Next()) { |
if (cell->IsJSGlobalPropertyCell()) { |
Address value_address = |
reinterpret_cast<Address>(cell) + |
(JSGlobalPropertyCell::kValueOffset - kHeapObjectTag); |
updating_visitor.VisitPointer(reinterpret_cast<Object**>(value_address)); |
+ Address type_address = |
+ reinterpret_cast<Address>(cell) + |
+ (JSGlobalPropertyCell::kTypeOffset - kHeapObjectTag); |
+ updating_visitor.VisitPointer(reinterpret_cast<Object**>(type_address)); |
} |
} |
@@ -4029,6 +4075,7 @@ void MarkCompactCollector::SweepSpaces() { |
SweepSpace(heap()->code_space(), PRECISE); |
SweepSpace(heap()->cell_space(), PRECISE); |
+ SweepSpace(heap()->property_cell_space(), PRECISE); |
EvacuateNewSpaceAndCandidates(); |