Chromium Code Reviews| Index: src/mark-compact.cc |
| diff --git a/src/mark-compact.cc b/src/mark-compact.cc |
| index 99c5b4864d3ed94cb37e5a113994bd35e4559acd..0eb1c8f42a59fcc023aedd4acf53a670bd128922 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->js_global_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->js_global_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()->js_global_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_->js_global_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_->js_global_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 JS_GLOBAL_PROPERTY_CELL_SPACE: |
| + return "JS_GLOBAL_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()->js_global_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()->js_global_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,28 @@ 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) + |
| + (JSGlobalPropertyCell::kValueOffset - kHeapObjectTag); |
|
Michael Starzinger
2013/06/12 13:23:25
Even though the values overlap I would recommend t
danno
2013/06/12 14:24:28
Done.
|
| + updating_visitor.VisitPointer(reinterpret_cast<Object**>(value_address)); |
| + } |
| + } |
| + |
| + HeapObjectIterator js_global_property_cell_iterator( |
| + heap_->js_global_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 +4076,7 @@ void MarkCompactCollector::SweepSpaces() { |
| SweepSpace(heap()->code_space(), PRECISE); |
| SweepSpace(heap()->cell_space(), PRECISE); |
| + SweepSpace(heap()->js_global_property_cell_space(), PRECISE); |
| EvacuateNewSpaceAndCandidates(); |