Reviewers: Mads Ager,

Description:
Add an additional sweeping pass over old space pages

Add an additional sweeping pass over old space pages to nullify all pointers
which satisfy the Heap::InNewSpace() predicate.

Please review this at http://codereview.chromium.org/2463003/show

Affected files:
  M src/heap.cc


Index: src/heap.cc
diff --git a/src/heap.cc b/src/heap.cc
index 79aced7d4d33c90a8df1fcae98b16e870d60df62..038d189cdb44fc91abcd73ddbf91e6f3842006cb 100644
--- a/src/heap.cc
+++ b/src/heap.cc
@@ -3444,7 +3444,6 @@ static bool IteratePointersInDirtyMaps(Address start,

   while (map_address < end) {
     ASSERT(!Heap::InNewSpace(Memory::Object_at(map_address)));
-    ASSERT(Memory::Object_at(map_address)->IsMap());

Address pointer_fields_start = map_address + Map::kPointerFieldsBeginOffset; Address pointer_fields_end = map_address + Map::kPointerFieldsEndOffset;
@@ -3473,7 +3472,6 @@ bool Heap::IteratePointersInDirtyMapsRegion(

   if (map_aligned_start != start) {
     Address prev_map = map_aligned_start - Map::kSize;
-    ASSERT(Memory::Object_at(prev_map)->IsMap());

     Address pointer_fields_start =
         Max(start, prev_map + Map::kPointerFieldsBeginOffset);
@@ -3495,8 +3493,6 @@ bool Heap::IteratePointersInDirtyMapsRegion(
       || contains_pointers_to_new_space;

   if (map_aligned_end != end) {
-    ASSERT(Memory::Object_at(map_aligned_end)->IsMap());
-
     Address pointer_fields_start = map_aligned_end + Map::kPrototypeOffset;

     Address pointer_fields_end =
@@ -3603,6 +3599,10 @@ uint32_t Heap::IterateDirtyRegions(
 }


+static void NullifyPointer(HeapObject** p) {
+  *p = NULL;
+}
+

 void Heap::IterateDirtyRegions(
     PagedSpace* space,
@@ -3639,6 +3639,15 @@ void Heap::IterateDirtyRegions(
                                                end,
                                                visit_dirty_region,
                                                copy_object_func));
+
+      // Do a sweeping pass over all regions marked clean.
+      // Nullify all pointer aligned words that satisfy the
+      // Heap::InNewSpace() predicate.
+      IterateDirtyRegions(~page->GetRegionMarks(),
+                          page->ObjectAreaStart(),
+                          space->PageAllocationLimit(page),
+                          visit_dirty_region,
+                          &NullifyPointer);
     }

// Mark page watermark as invalid to maintain watermark validity invariant.


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

Reply via email to