Reviewers: Toon Verwaest,

Message:
per our discussion...

Description:
Gcstress bug fix: Transition arrays may get smaller during gc.

Please review this at https://codereview.chromium.org/234873004/

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

Affected files (+18, -11 lines):
  M src/objects-inl.h
  M src/transitions.h
  M src/transitions.cc


Index: src/objects-inl.h
diff --git a/src/objects-inl.h b/src/objects-inl.h
index 524dfbe698734edc85ea34d63ba2b8aaa00fb1b6..b89b31dd736883743b07569373277885880c7a3e 100644
--- a/src/objects-inl.h
+++ b/src/objects-inl.h
@@ -4969,8 +4969,7 @@ static void EnsureHasTransitionArray(Handle<Map> map) {
     transitions = TransitionArray::Allocate(map->GetIsolate(), 0);
     transitions->set_back_pointer_storage(map->GetBackPointer());
   } else if (!map->transitions()->IsFullTransitionArray()) {
-    transitions = TransitionArray::ExtendToFullTransitionArray(
-        handle(map->transitions()));
+    transitions = TransitionArray::ExtendToFullTransitionArray(map);
   } else {
     return;
   }
Index: src/transitions.cc
diff --git a/src/transitions.cc b/src/transitions.cc
index dc0a307cf077a54560883af20a9005dd980bd9a9..2397fc138f762ec5157b801ab82bdc107efdcd78 100644
--- a/src/transitions.cc
+++ b/src/transitions.cc
@@ -86,17 +86,23 @@ Handle<TransitionArray> TransitionArray::NewWith(Handle<Map> map,


 Handle<TransitionArray> TransitionArray::ExtendToFullTransitionArray(
-    Handle<TransitionArray> array) {
-  ASSERT(!array->IsFullTransitionArray());
-  int nof = array->number_of_transitions();
-  Handle<TransitionArray> result = Allocate(array->GetIsolate(), nof);
-
-  if (nof == 1) {
+    Handle<Map> containing_map) {
+  ASSERT(!containing_map->transitions()->IsFullTransitionArray());
+  int nof = containing_map->transitions()->number_of_transitions();
+
+  // A transition array may shrink during GC.
+ Handle<TransitionArray> result = Allocate(containing_map->GetIsolate(), nof);
+  int new_nof = containing_map->transitions()->number_of_transitions();
+  if (new_nof != nof) {
+    ASSERT(new_nof == 0);
+    result->Shrink(ToKeyIndex(0));
+  } else if (nof == 1) {
     result->NoIncrementalWriteBarrierCopyFrom(
-        *array, kSimpleTransitionIndex, 0);
+        containing_map->transitions(), kSimpleTransitionIndex, 0);
   }

-  result->set_back_pointer_storage(array->back_pointer_storage());
+  result->set_back_pointer_storage(
+      containing_map->transitions()->back_pointer_storage());
   return result;
 }

Index: src/transitions.h
diff --git a/src/transitions.h b/src/transitions.h
index 0c1acf8633b33182211040130cf05cf51902562a..e0ec8a01e7724f30ff1e883d9cec34d1cbe8543a 100644
--- a/src/transitions.h
+++ b/src/transitions.h
@@ -95,8 +95,10 @@ class TransitionArray: public FixedArray {

   inline int number_of_entries() { return number_of_transitions(); }

+  // Creates a FullTransitionArray from a SimpleTransitionArray in
+  // containing_map.
   static Handle<TransitionArray> ExtendToFullTransitionArray(
-      Handle<TransitionArray> array);
+      Handle<Map> containing_map);

// Create a transition array, copying from the owning map if it already has
   // one, otherwise creating a new one according to flag.


--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
--- You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to