| Index: src/heap.cc
|
| ===================================================================
|
| --- src/heap.cc (revision 2411)
|
| +++ src/heap.cc (working copy)
|
| @@ -601,6 +601,7 @@
|
| }
|
| #endif
|
|
|
| +
|
| void Heap::Scavenge() {
|
| #ifdef DEBUG
|
| if (FLAG_enable_slow_asserts) VerifyNonPointerSpacePointers();
|
| @@ -667,12 +668,6 @@
|
| HeapObject* heap_object = old_pointer_iterator.next();
|
| heap_object->Iterate(&scavenge_visitor);
|
| }
|
| -
|
| - HeapObjectIterator cell_iterator(cell_space_);
|
| - while (cell_iterator.has_next()) {
|
| - cell_iterator.next()->Iterate(&scavenge_visitor));
|
| - }
|
| -
|
| HeapObjectIterator map_iterator(map_space_);
|
| while (map_iterator.has_next()) {
|
| HeapObject* heap_object = map_iterator.next();
|
| @@ -689,11 +684,22 @@
|
| // Copy objects reachable from the old generation. By definition,
|
| // there are no intergenerational pointers in code or data spaces.
|
| IterateRSet(old_pointer_space_, &ScavengePointer);
|
| - IterateRSet(cell_space_, &ScavengePointer);
|
| IterateRSet(map_space_, &ScavengePointer);
|
| lo_space_->IterateRSet(&ScavengePointer);
|
| #endif
|
|
|
| + // Copy objects reachable from cells by scavenging cell values directly.
|
| + HeapObjectIterator cell_iterator(cell_space_);
|
| + while (cell_iterator.has_next()) {
|
| + HeapObject* cell = cell_iterator.next();
|
| + if (cell->IsJSGlobalPropertyCell()) {
|
| + Address value_address =
|
| + reinterpret_cast<Address>(cell) +
|
| + (JSGlobalPropertyCell::kValueOffset - kHeapObjectTag);
|
| + scavenge_visitor.VisitPointer(reinterpret_cast<Object**>(value_address));
|
| + }
|
| + }
|
| +
|
| do {
|
| ASSERT(new_space_front <= new_space_.top());
|
|
|
| @@ -832,17 +838,14 @@
|
|
|
|
|
| void Heap::RebuildRSets() {
|
| - // By definition, we do not care about remembered set bits in code or data
|
| - // spaces.
|
| + // By definition, we do not care about remembered set bits in code,
|
| + // data, or cell spaces.
|
| map_space_->ClearRSet();
|
| RebuildRSets(map_space_);
|
|
|
| old_pointer_space_->ClearRSet();
|
| RebuildRSets(old_pointer_space_);
|
|
|
| - cell_space_->ClearRSet();
|
| - RebuildRSets(cell_space_);
|
| -
|
| Heap::lo_space_->ClearRSet();
|
| RebuildRSets(lo_space_);
|
| }
|
| @@ -2864,9 +2867,7 @@
|
|
|
| void Heap::IterateRSet(PagedSpace* space, ObjectSlotCallback copy_object_func) {
|
| ASSERT(Page::is_rset_in_use());
|
| - ASSERT(space == old_pointer_space_ ||
|
| - space == cell_space_ ||
|
| - space == map_space_);
|
| + ASSERT(space == old_pointer_space_ || space == map_space_);
|
|
|
| static void* paged_rset_histogram = StatsTable::CreateHistogram(
|
| "V8.RSetPaged",
|
|
|