Revision: 12689
Author:   [email protected]
Date:     Wed Oct 10 06:13:35 2012
Log: Transition ownership back if the descriptors were shared via elements transitions.

BUG=

Review URL: https://chromiumcodereview.appspot.com/11091044
http://code.google.com/p/v8/source/detail?r=12689

Modified:
 /branches/bleeding_edge/src/objects.cc

=======================================
--- /branches/bleeding_edge/src/objects.cc      Wed Oct 10 05:31:50 2012
+++ /branches/bleeding_edge/src/objects.cc      Wed Oct 10 06:13:35 2012
@@ -7429,15 +7429,6 @@
     fprintf(file, "%c", Get(i));
   }
 }
-
-
-// Clear a possible back pointer in case the transition leads to a dead map.
-// Return true in case a back pointer has been cleared and false otherwise.
-static bool ClearBackPointer(Heap* heap, Map* target) {
-  if (Marking::MarkBitFrom(target).Get()) return false;
-  target->SetBackPointer(heap->undefined_value(), SKIP_WRITE_BARRIER);
-  return true;
-}


static void TrimEnumCache(Heap* heap, Map* map, DescriptorArray* descriptors) {
@@ -7483,6 +7474,21 @@
   if (descriptors->HasEnumCache()) TrimEnumCache(heap, map, descriptors);
   descriptors->Sort();
 }
+
+
+// Clear a possible back pointer in case the transition leads to a dead map.
+// Return true in case a back pointer has been cleared and false otherwise.
+static bool ClearBackPointer(Heap* heap,
+                             Map* target,
+                             DescriptorArray* descriptors,
+                             bool* descriptors_owner_died) {
+  if (Marking::MarkBitFrom(target).Get()) return false;
+  if (target->instance_descriptors() == descriptors) {
+    *descriptors_owner_died = true;
+  }
+  target->SetBackPointer(heap->undefined_value(), SKIP_WRITE_BARRIER);
+  return true;
+}


// TODO(mstarzinger): This method should be moved into MarkCompactCollector,
@@ -7505,15 +7511,7 @@
   // Compact all live descriptors to the left.
   for (int i = 0; i < t->number_of_transitions(); ++i) {
     Map* target = t->GetTarget(i);
-    if (ClearBackPointer(heap, target)) {
-      ASSERT(!Marking::IsGrey(Marking::MarkBitFrom(target)));
-      DescriptorArray* target_descriptors = target->instance_descriptors();
-      if ((target_descriptors->number_of_descriptors() == 0 &&
-           target->NumberOfOwnDescriptors() > 0) ||
-          target_descriptors == descriptors) {
-        descriptors_owner_died = true;
-      }
-    } else {
+ if (!ClearBackPointer(heap, target, descriptors, &descriptors_owner_died)) {
       if (i != transition_index) {
         String* key = t->GetKey(i);
         t->SetKey(transition_index, key);
@@ -7527,10 +7525,10 @@
   }

   if (t->HasElementsTransition() &&
-      ClearBackPointer(heap, t->elements_transition())) {
-    if (t->elements_transition()->instance_descriptors() == descriptors) {
-      descriptors_owner_died = true;
-    }
+      ClearBackPointer(heap,
+                       t->elements_transition(),
+                       descriptors,
+                       &descriptors_owner_died)) {
     t->ClearElementsTransition();
   } else {
     // If there are no transitions to be cleared, return.

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

Reply via email to