| 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();
|
|
|
|
|