Reviewers: bak,

Description:
During a scavenge, instead of sweeping remembered-set bits for global
property cells, sweep the cell values themselves.


Please review this at http://codereview.chromium.org/149387

SVN Base: http://v8.googlecode.com/svn/branches/bleeding_edge/

Affected files:
   M     src/heap.cc


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",



--~--~---------~--~----~------------~-------~--~----~
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
-~----------~----~----~----~------~----~------~--~---

Reply via email to