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(©)) 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); |