Reviewers: Michael Starzinger,

Description:
DescriptorArray::CopyFrom should always drop transitions for CALLBACKS.


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

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

Affected files:
  M src/bootstrapper.cc
  M src/factory.cc
  M src/objects-inl.h
  M src/objects.h
  M src/objects.cc


Index: src/bootstrapper.cc
diff --git a/src/bootstrapper.cc b/src/bootstrapper.cc
index 31a771fbeb0a00f10b265ca0ddaa7227a105a361..ef53df46cd17141937fc916539b5a70cee08d04c 100644
--- a/src/bootstrapper.cc
+++ b/src/bootstrapper.cc
@@ -1743,7 +1743,9 @@ bool Genesis::InstallNatives() {
     Handle<DescriptorArray> array_descriptors(
         array_function->initial_map()->instance_descriptors());
int index = array_descriptors->SearchWithCache(heap()->length_symbol());
-    reresult_descriptors->CopyFrom(0, *array_descriptors, index, witness);
+    MaybeObject* copy_result =
+ reresult_descriptors->CopyFrom(0, *array_descriptors, index, witness);
+    if (copy_result->IsFailure()) return false;

     int enum_index = 0;
     {
Index: src/factory.cc
diff --git a/src/factory.cc b/src/factory.cc
index 5915f487de3432956a0edb39809d813e1e713ff6..daf9d64f5daf8dd7adadb44cb45ebbc1e293f2b0 100644
--- a/src/factory.cc
+++ b/src/factory.cc
@@ -865,7 +865,7 @@ Handle<DescriptorArray> Factory::CopyAppendCallbackDescriptors(
   // Copy the descriptors from the array.
   for (int i = 0; i < array->number_of_descriptors(); i++) {
     if (!array->IsNullDescriptor(i)) {
-      result->CopyFrom(descriptor_count++, *array, i, witness);
+ DescriptorArray::CopyFrom(result, descriptor_count++, array, i, witness);
     }
   }

@@ -899,7 +899,7 @@ Handle<DescriptorArray> Factory::CopyAppendCallbackDescriptors(
     Handle<DescriptorArray> new_result =
         NewDescriptorArray(number_of_descriptors);
     for (int i = 0; i < number_of_descriptors; i++) {
-      new_result->CopyFrom(i, *result, i, witness);
+      DescriptorArray::CopyFrom(new_result, i, result, i, witness);
     }
     result = new_result;
   }
Index: src/objects-inl.h
diff --git a/src/objects-inl.h b/src/objects-inl.h
index eef5e6bf6f7179900c2dc9e93a68fafbc6f08c0e..a5aa5a84ba556428a21ddc01507d6ff30a7cee8f 100644
--- a/src/objects-inl.h
+++ b/src/objects-inl.h
@@ -2053,16 +2053,6 @@ void DescriptorArray::Set(int descriptor_number,
 }


-void DescriptorArray::CopyFrom(int index,
-                               DescriptorArray* src,
-                               int src_index,
-                               const WhitenessWitness& witness) {
-  Descriptor desc;
-  src->Get(src_index, &desc);
-  Set(index, &desc, witness);
-}
-
-
 void DescriptorArray::NoIncrementalWriteBarrierSwapDescriptors(
     int first, int second) {
NoIncrementalWriteBarrierSwap(this, ToKeyIndex(first), ToKeyIndex(second));
Index: src/objects.cc
diff --git a/src/objects.cc b/src/objects.cc
index aef028456f61ed4411fb66927375cd050f4c8f6f..ff94dd029daafa607279f93bf87eb85a1c5318ca 100644
--- a/src/objects.cc
+++ b/src/objects.cc
@@ -5735,6 +5735,33 @@ static bool InsertionPointFound(String* key1, String* key2) {
 }


+void DescriptorArray::CopyFrom(Handle<DescriptorArray> dst,
+                               int dst_index,
+                               Handle<DescriptorArray> src,
+                               int src_index,
+                               const WhitenessWitness& witness) {
+  CALL_HEAP_FUNCTION_VOID(dst->GetIsolate(),
+ dst->CopyFrom(dst_index, *src, src_index, witness));
+}
+
+
+MaybeObject* DescriptorArray::CopyFrom(int dst_index,
+                                       DescriptorArray* src,
+                                       int src_index,
+                                       const WhitenessWitness& witness) {
+  Object* value = src->GetValue(src_index);
+  PropertyDetails details(src->GetDetails(src_index));
+  if (details.type() == CALLBACKS && value->IsAccessorPair()) {
+    MaybeObject* maybe_copy =
+        AccessorPair::cast(value)->CopyWithoutTransitions();
+    if (!maybe_copy->To(&value)) return maybe_copy;
+  }
+  Descriptor desc(src->GetKey(src_index), value, details);
+  Set(dst_index, &desc, witness);
+  return this;
+}
+
+
 MaybeObject* DescriptorArray::CopyInsert(Descriptor* descriptor,
                                          TransitionFlag transition_flag) {
   // Transitions are only kept when inserting another transition.
@@ -5818,7 +5845,9 @@ MaybeObject* DescriptorArray::CopyInsert(Descriptor* descriptor,
     } else {
       if (!(IsNullDescriptor(from_index) ||
             (remove_transitions && IsTransitionOnly(from_index)))) {
-        new_descriptors->CopyFrom(to_index++, this, from_index, witness);
+        MaybeObject* copy_result =
+ new_descriptors->CopyFrom(to_index++, this, from_index, witness);
+        if (copy_result->IsFailure()) return copy_result;
       }
       from_index++;
     }
@@ -5858,7 +5887,9 @@ MaybeObject* DescriptorArray::RemoveTransitions() {
   int next_descriptor = 0;
   for (int i = 0; i < number_of_descriptors(); i++) {
     if (IsProperty(i)) {
-      new_descriptors->CopyFrom(next_descriptor++, this, i, witness);
+      MaybeObject* copy_result =
+          new_descriptors->CopyFrom(next_descriptor++, this, i, witness);
+      if (copy_result->IsFailure()) return copy_result;
     }
   }
   ASSERT(next_descriptor == new_descriptors->number_of_descriptors());
@@ -5971,6 +6002,18 @@ int DescriptorArray::LinearSearch(String* name, int len) {
 }


+MaybeObject* AccessorPair::CopyWithoutTransitions() {
+  Heap* heap = GetHeap();
+  AccessorPair* copy;
+  { MaybeObject* maybe_copy = heap->AllocateAccessorPair();
+    if (!maybe_copy->To(&copy)) return maybe_copy;
+  }
+  copy->set_getter(getter()->IsMap() ? heap->the_hole_value() : getter());
+  copy->set_setter(setter()->IsMap() ? heap->the_hole_value() : setter());
+  return copy;
+}
+
+
 MaybeObject* DeoptimizationInputData::Allocate(int deopt_entry_count,
                                                PretenureFlag pretenure) {
   ASSERT(deopt_entry_count > 0);
Index: src/objects.h
diff --git a/src/objects.h b/src/objects.h
index ef22af87178265704d961337f6dafc0af2d16034..1e49f0733f12af230cca895f8f3d04b7bc44ffc9 100644
--- a/src/objects.h
+++ b/src/objects.h
@@ -2434,12 +2434,18 @@ class DescriptorArray: public FixedArray {
                   Descriptor* desc,
                   const WhitenessWitness&);

-  // Transfer complete descriptor from another descriptor array to
-  // this one.
-  inline void CopyFrom(int index,
-                       DescriptorArray* src,
+ // Transfer complete descriptor from src descriptor array to dst, dropping map
+  // transitions in CALLBACKS.
+  static void CopyFrom(Handle<DescriptorArray> dst,
+                       int dst_index,
+                       Handle<DescriptorArray> src,
                        int src_index,
-                       const WhitenessWitness&);
+                       const WhitenessWitness& witness);
+
+  MUST_USE_RESULT MaybeObject* CopyFrom(int dst_index,
+                                        DescriptorArray* src,
+                                        int src_index,
+                                        const WhitenessWitness&);

   // Copy the descriptor array, insert a new descriptor and optionally
   // remove map transitions.  If the descriptor is already present, it is
@@ -7782,6 +7788,8 @@ class AccessorPair: public Struct {

   static inline AccessorPair* cast(Object* obj);

+  MaybeObject* CopyWithoutTransitions();
+
 #ifdef OBJECT_PRINT
   void AccessorPairPrint(FILE* out = stdout);
 #endif


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

Reply via email to