| Index: src/objects.cc
|
| diff --git a/src/objects.cc b/src/objects.cc
|
| index 84fcee71e5a78ed8a99b7ab85623a419622b848d..607d5cff4f2ec34255a1e12513ef724620b5e443 100644
|
| --- a/src/objects.cc
|
| +++ b/src/objects.cc
|
| @@ -7992,97 +7992,88 @@ void DescriptorArray::CopyFrom(int dst_index,
|
| }
|
|
|
|
|
| -Handle<DescriptorArray> DescriptorArray::Merge(Handle<DescriptorArray> desc,
|
| - int verbatim,
|
| - int valid,
|
| - int new_size,
|
| - int modify_index,
|
| - StoreMode store_mode,
|
| - Handle<DescriptorArray> other) {
|
| - CALL_HEAP_FUNCTION(desc->GetIsolate(),
|
| - desc->Merge(verbatim, valid, new_size, modify_index,
|
| - store_mode, *other),
|
| - DescriptorArray);
|
| -}
|
| -
|
| -
|
| // Generalize the |other| descriptor array by merging it into the (at least
|
| -// partly) updated |this| descriptor array.
|
| +// partly) updated |desc| descriptor array.
|
| // The method merges two descriptor array in three parts. Both descriptor arrays
|
| // are identical up to |verbatim|. They also overlap in keys up to |valid|.
|
| // Between |verbatim| and |valid|, the resulting descriptor type as well as the
|
| -// representation are generalized from both |this| and |other|. Beyond |valid|,
|
| +// representation are generalized from both |desc| and |other|. Beyond |valid|,
|
| // the descriptors are copied verbatim from |other| up to |new_size|.
|
| // In case of incompatible types, the type and representation of |other| is
|
| // used.
|
| -MaybeObject* DescriptorArray::Merge(int verbatim,
|
| - int valid,
|
| - int new_size,
|
| - int modify_index,
|
| - StoreMode store_mode,
|
| - DescriptorArray* other) {
|
| +Handle<DescriptorArray> DescriptorArray::Merge(Handle<DescriptorArray> desc,
|
| + int verbatim,
|
| + int valid,
|
| + int new_size,
|
| + int modify_index,
|
| + StoreMode store_mode,
|
| + Handle<DescriptorArray> other) {
|
| ASSERT(verbatim <= valid);
|
| ASSERT(valid <= new_size);
|
|
|
| - DescriptorArray* result;
|
| // Allocate a new descriptor array large enough to hold the required
|
| // descriptors, with minimally the exact same size as this descriptor array.
|
| - MaybeObject* maybe_descriptors = DescriptorArray::Allocate(
|
| - GetIsolate(), new_size,
|
| - Max(new_size, other->number_of_descriptors()) - new_size);
|
| - if (!maybe_descriptors->To(&result)) return maybe_descriptors;
|
| - ASSERT(result->length() > length() ||
|
| + Isolate* isolate = desc->GetIsolate();
|
| + Handle<DescriptorArray> result = isolate->factory()->NewDescriptorArray(
|
| + new_size, Max(new_size, other->number_of_descriptors()) - new_size);
|
| + ASSERT(result->length() > desc->length() ||
|
| result->NumberOfSlackDescriptors() > 0 ||
|
| result->number_of_descriptors() == other->number_of_descriptors());
|
| ASSERT(result->number_of_descriptors() == new_size);
|
|
|
| - DescriptorArray::WhitenessWitness witness(result);
|
| -
|
| int descriptor;
|
|
|
| // 0 -> |verbatim|
|
| int current_offset = 0;
|
| for (descriptor = 0; descriptor < verbatim; descriptor++) {
|
| - if (GetDetails(descriptor).type() == FIELD) current_offset++;
|
| - result->CopyFrom(descriptor, other, descriptor, witness);
|
| + if (desc->GetDetails(descriptor).type() == FIELD) current_offset++;
|
| + Descriptor d(other->GetKey(descriptor),
|
| + other->GetValue(descriptor),
|
| + other->GetDetails(descriptor));
|
| + result->Set(descriptor, &d);
|
| }
|
|
|
| // |verbatim| -> |valid|
|
| for (; descriptor < valid; descriptor++) {
|
| - Name* key = GetKey(descriptor);
|
| - PropertyDetails details = GetDetails(descriptor);
|
| + PropertyDetails details = desc->GetDetails(descriptor);
|
| PropertyDetails other_details = other->GetDetails(descriptor);
|
|
|
| if (details.type() == FIELD || other_details.type() == FIELD ||
|
| (store_mode == FORCE_FIELD && descriptor == modify_index) ||
|
| (details.type() == CONSTANT &&
|
| other_details.type() == CONSTANT &&
|
| - GetValue(descriptor) != other->GetValue(descriptor))) {
|
| + desc->GetValue(descriptor) != other->GetValue(descriptor))) {
|
| Representation representation =
|
| details.representation().generalize(other_details.representation());
|
| - FieldDescriptor d(key,
|
| + FieldDescriptor d(desc->GetKey(descriptor),
|
| current_offset++,
|
| other_details.attributes(),
|
| representation);
|
| - result->Set(descriptor, &d, witness);
|
| + result->Set(descriptor, &d);
|
| } else {
|
| - result->CopyFrom(descriptor, other, descriptor, witness);
|
| + Descriptor d(other->GetKey(descriptor),
|
| + other->GetValue(descriptor),
|
| + other->GetDetails(descriptor));
|
| + result->Set(descriptor, &d);
|
| }
|
| }
|
|
|
| // |valid| -> |new_size|
|
| for (; descriptor < new_size; descriptor++) {
|
| PropertyDetails details = other->GetDetails(descriptor);
|
| +
|
| if (details.type() == FIELD ||
|
| (store_mode == FORCE_FIELD && descriptor == modify_index)) {
|
| - Name* key = other->GetKey(descriptor);
|
| - FieldDescriptor d(key,
|
| + FieldDescriptor d(other->GetKey(descriptor),
|
| current_offset++,
|
| details.attributes(),
|
| details.representation());
|
| - result->Set(descriptor, &d, witness);
|
| + result->Set(descriptor, &d);
|
| } else {
|
| - result->CopyFrom(descriptor, other, descriptor, witness);
|
| + Descriptor d(other->GetKey(descriptor),
|
| + other->GetValue(descriptor),
|
| + other->GetDetails(descriptor));
|
| + result->Set(descriptor, &d);
|
| }
|
| }
|
|
|
|
|