Revision: 12519
Author:   [email protected]
Date:     Fri Sep 14 08:10:31 2012
Log:      Moving the WhitenessWitness back to DescriptorArray.

TransitionArrays never allocate while being created.

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

Modified:
 /branches/bleeding_edge/src/objects-inl.h
 /branches/bleeding_edge/src/objects.cc
 /branches/bleeding_edge/src/objects.h
 /branches/bleeding_edge/src/transitions-inl.h
 /branches/bleeding_edge/src/transitions.cc
 /branches/bleeding_edge/src/transitions.h

=======================================
--- /branches/bleeding_edge/src/objects-inl.h   Wed Sep 12 09:43:57 2012
+++ /branches/bleeding_edge/src/objects-inl.h   Fri Sep 14 08:10:31 2012
@@ -2167,14 +2167,14 @@
 }


-FixedArray::WhitenessWitness::WhitenessWitness(FixedArray* array)
+DescriptorArray::WhitenessWitness::WhitenessWitness(FixedArray* array)
     : marking_(array->GetHeap()->incremental_marking()) {
   marking_->EnterNoMarkingScope();
   ASSERT(Marking::Color(array) == Marking::WHITE_OBJECT);
 }


-FixedArray::WhitenessWitness::~WhitenessWitness() {
+DescriptorArray::WhitenessWitness::~WhitenessWitness() {
   marking_->LeaveNoMarkingScope();
 }

=======================================
--- /branches/bleeding_edge/src/objects.cc      Fri Sep 14 06:15:43 2012
+++ /branches/bleeding_edge/src/objects.cc      Fri Sep 14 08:10:31 2012
@@ -5022,7 +5022,7 @@
   DescriptorArray* new_descriptors;
   MaybeObject* maybe_descriptors = DescriptorArray::Allocate(old_size + 1);
   if (!maybe_descriptors->To(&new_descriptors)) return maybe_descriptors;
-  FixedArray::WhitenessWitness witness(new_descriptors);
+  DescriptorArray::WhitenessWitness witness(new_descriptors);

   for (int i = 0; i < old_size; ++i) {
     new_descriptors->CopyFrom(i, descriptors, i, witness);
@@ -5212,7 +5212,7 @@
   MaybeObject* maybe_descriptors = DescriptorArray::Allocate(old_size + 1);
   if (!maybe_descriptors->To(&new_descriptors)) return maybe_descriptors;

-  FixedArray::WhitenessWitness witness(new_descriptors);
+  DescriptorArray::WhitenessWitness witness(new_descriptors);

   // Copy the descriptors, inserting a descriptor.
   for (int i = 0; i < old_size; ++i) {
@@ -12921,7 +12921,7 @@
     return maybe_descriptors;
   }

-  FixedArray::WhitenessWitness witness(descriptors);
+  DescriptorArray::WhitenessWitness witness(descriptors);

   int number_of_allocated_fields =
       number_of_fields + unused_property_fields - inobject_props;
=======================================
--- /branches/bleeding_edge/src/objects.h       Fri Sep 14 06:15:43 2012
+++ /branches/bleeding_edge/src/objects.h       Fri Sep 14 08:10:31 2012
@@ -2375,23 +2375,6 @@
     }
   };

-  // WhitenessWitness is used to prove that a descriptor array is white
-  // (unmarked), so incremental write barriers can be skipped because the
-  // marking invariant cannot be broken and slots pointing into evacuation
-  // candidates will be discovered when the object is scanned. A witness is
-  // always stack-allocated right after creating an array. By allocating a
-  // witness, incremental marking is globally disabled. The witness is then
- // passed along wherever needed to statically prove that the array is known to
-  // be white.
-  class WhitenessWitness {
-   public:
-    inline explicit WhitenessWitness(FixedArray* array);
-    inline ~WhitenessWitness();
-
-   private:
-    IncrementalMarking* marking_;
-  };
-
  protected:
   // Set operation on FixedArray without using write barriers. Can
   // only be used for storing old space objects or smis.
@@ -2475,6 +2458,23 @@
 //   [length() - kDescriptorSize]: last key
 class DescriptorArray: public FixedArray {
  public:
+  // WhitenessWitness is used to prove that a descriptor array is white
+  // (unmarked), so incremental write barriers can be skipped because the
+  // marking invariant cannot be broken and slots pointing into evacuation
+  // candidates will be discovered when the object is scanned. A witness is
+  // always stack-allocated right after creating an array. By allocating a
+  // witness, incremental marking is globally disabled. The witness is then
+ // passed along wherever needed to statically prove that the array is known to
+  // be white.
+  class WhitenessWitness {
+   public:
+    inline explicit WhitenessWitness(FixedArray* array);
+    inline ~WhitenessWitness();
+
+   private:
+    IncrementalMarking* marking_;
+  };
+
// Returns true for both shared empty_descriptor_array and for smis, which the // map uses to encode additional bit fields when the descriptor array is not
   // yet used.
=======================================
--- /branches/bleeding_edge/src/transitions-inl.h       Wed Sep 12 09:43:57 2012
+++ /branches/bleeding_edge/src/transitions-inl.h       Fri Sep 14 08:10:31 2012
@@ -200,16 +200,13 @@
 }


-void TransitionArray::Set(int transition_number,
-                          String* key,
-                          Map* target,
-                          const WhitenessWitness&) {
-  NoIncrementalWriteBarrierSet(this,
-                               ToKeyIndex(transition_number),
-                               key);
-  NoIncrementalWriteBarrierSet(this,
-                               ToTargetIndex(transition_number),
-                               target);
+void TransitionArray::NoIncrementalWriteBarrierSet(int transition_number,
+                                                   String* key,
+                                                   Map* target) {
+  FixedArray::NoIncrementalWriteBarrierSet(
+      this, ToKeyIndex(transition_number), key);
+  FixedArray::NoIncrementalWriteBarrierSet(
+      this, ToTargetIndex(transition_number), target);
 }


=======================================
--- /branches/bleeding_edge/src/transitions.cc  Wed Sep 12 09:43:57 2012
+++ /branches/bleeding_edge/src/transitions.cc  Fri Sep 14 08:10:31 2012
@@ -58,14 +58,12 @@
 }


-void TransitionArray::CopyFrom(TransitionArray* origin,
-                               int origin_transition,
-                               int target_transition,
-                               const WhitenessWitness& witness) {
-  Set(target_transition,
-      origin->GetKey(origin_transition),
-      origin->GetTarget(origin_transition),
-      witness);
+void TransitionArray::NoIncrementalWriteBarrierCopyFrom(TransitionArray* origin, + int origin_transition, + int target_transition) {
+  NoIncrementalWriteBarrierSet(target_transition,
+                               origin->GetKey(origin_transition),
+                               origin->GetTarget(origin_transition));
 }


@@ -84,9 +82,7 @@
MaybeObject* maybe_array = TransitionArray::Allocate(1, descriptors_pointer);
   if (!maybe_array->To(&result)) return maybe_array;

-  FixedArray::WhitenessWitness witness(result);
-
-  result->Set(0, name, target, witness);
+  result->NoIncrementalWriteBarrierSet(0, name, target);
   result->set_back_pointer_storage(back_pointer);
   return result;
 }
@@ -112,27 +108,29 @@
   if (HasPrototypeTransitions()) {
     result->SetPrototypeTransitions(GetPrototypeTransitions());
   }
-
-  FixedArray::WhitenessWitness witness(result);

   if (insertion_index != kNotFound) {
     for (int i = 0; i < number_of_transitions; ++i) {
-      if (i != insertion_index) result->CopyFrom(this, i, i, witness);
+      if (i != insertion_index) {
+        result->NoIncrementalWriteBarrierCopyFrom(this, i, i);
+      }
     }
-    result->Set(insertion_index, name, target, witness);
+    result->NoIncrementalWriteBarrierSet(insertion_index, name, target);
     return result;
   }

   insertion_index = 0;
   for (; insertion_index < number_of_transitions; ++insertion_index) {
     if (InsertionPointFound(GetKey(insertion_index), name)) break;
-    result->CopyFrom(this, insertion_index, insertion_index, witness);
+    result->NoIncrementalWriteBarrierCopyFrom(
+        this, insertion_index, insertion_index);
   }

-  result->Set(insertion_index, name, target, witness);
+  result->NoIncrementalWriteBarrierSet(insertion_index, name, target);

   for (; insertion_index < number_of_transitions; ++insertion_index) {
-    result->CopyFrom(this, insertion_index, insertion_index + 1, witness);
+    result->NoIncrementalWriteBarrierCopyFrom(
+        this, insertion_index, insertion_index + 1);
   }

   result->set_back_pointer_storage(back_pointer_storage());
=======================================
--- /branches/bleeding_edge/src/transitions.h   Wed Sep 12 09:43:57 2012
+++ /branches/bleeding_edge/src/transitions.h   Fri Sep 14 08:10:31 2012
@@ -111,10 +111,9 @@
   MUST_USE_RESULT MaybeObject* CopyInsert(String* name, Map* target);

   // Copy a single transition from the origin array.
-  inline void CopyFrom(TransitionArray* origin,
-                       int origin_transition,
-                       int target_transition,
-                       const WhitenessWitness& witness);
+  inline void NoIncrementalWriteBarrierCopyFrom(TransitionArray* origin,
+                                                int origin_transition,
+                                                int target_transition);

   // Search a transition for a given property name.
   inline int Search(String* name);
@@ -182,10 +181,9 @@
            kTransitionTarget;
   }

-  inline void Set(int transition_number,
-                  String* key,
-                  Map* target,
-                  const WhitenessWitness&);
+  inline void NoIncrementalWriteBarrierSet(int transition_number,
+                                           String* key,
+                                           Map* target);

   DISALLOW_IMPLICIT_CONSTRUCTORS(TransitionArray);
 };

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

Reply via email to