From: bmeurer@chromium.org Date: Tue, 18 Feb 2014 10:38:25 +0000 (+0000) Subject: Revert "Handlify DescriptorArray::Merge()." X-Git-Tag: upstream/4.7.83~10662 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=0ec3dc296a8df41af9f05fd86ead998a842d93e2;p=platform%2Fupstream%2Fv8.git Revert "Handlify DescriptorArray::Merge()." This reverts commit r19410. TBR=verwaest@chromium.org Review URL: https://codereview.chromium.org/169113005 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@19432 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- diff --git a/src/objects.cc b/src/objects.cc index 607d5cf..84fcee7 100644 --- a/src/objects.cc +++ b/src/objects.cc @@ -7992,15 +7992,6 @@ void DescriptorArray::CopyFrom(int dst_index, } -// Generalize the |other| descriptor array by merging it into the (at least -// 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 |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. Handle DescriptorArray::Merge(Handle desc, int verbatim, int valid, @@ -8008,72 +7999,90 @@ Handle DescriptorArray::Merge(Handle desc, int modify_index, StoreMode store_mode, Handle 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. +// 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|, +// 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) { 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. - Isolate* isolate = desc->GetIsolate(); - Handle result = isolate->factory()->NewDescriptorArray( - new_size, Max(new_size, other->number_of_descriptors()) - new_size); - ASSERT(result->length() > desc->length() || + 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() || 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 (desc->GetDetails(descriptor).type() == FIELD) current_offset++; - Descriptor d(other->GetKey(descriptor), - other->GetValue(descriptor), - other->GetDetails(descriptor)); - result->Set(descriptor, &d); + if (GetDetails(descriptor).type() == FIELD) current_offset++; + result->CopyFrom(descriptor, other, descriptor, witness); } // |verbatim| -> |valid| for (; descriptor < valid; descriptor++) { - PropertyDetails details = desc->GetDetails(descriptor); + Name* key = GetKey(descriptor); + PropertyDetails details = 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 && - desc->GetValue(descriptor) != other->GetValue(descriptor))) { + GetValue(descriptor) != other->GetValue(descriptor))) { Representation representation = details.representation().generalize(other_details.representation()); - FieldDescriptor d(desc->GetKey(descriptor), + FieldDescriptor d(key, current_offset++, other_details.attributes(), representation); - result->Set(descriptor, &d); + result->Set(descriptor, &d, witness); } else { - Descriptor d(other->GetKey(descriptor), - other->GetValue(descriptor), - other->GetDetails(descriptor)); - result->Set(descriptor, &d); + result->CopyFrom(descriptor, other, descriptor, witness); } } // |valid| -> |new_size| for (; descriptor < new_size; descriptor++) { PropertyDetails details = other->GetDetails(descriptor); - if (details.type() == FIELD || (store_mode == FORCE_FIELD && descriptor == modify_index)) { - FieldDescriptor d(other->GetKey(descriptor), + Name* key = other->GetKey(descriptor); + FieldDescriptor d(key, current_offset++, details.attributes(), details.representation()); - result->Set(descriptor, &d); + result->Set(descriptor, &d, witness); } else { - Descriptor d(other->GetKey(descriptor), - other->GetValue(descriptor), - other->GetDetails(descriptor)); - result->Set(descriptor, &d); + result->CopyFrom(descriptor, other, descriptor, witness); } } diff --git a/src/objects.h b/src/objects.h index 0047bf9..cd152a2 100644 --- a/src/objects.h +++ b/src/objects.h @@ -3384,8 +3384,13 @@ class DescriptorArray: public FixedArray { int new_size, int modify_index, StoreMode store_mode, - Handle other) - V8_WARN_UNUSED_RESULT; + Handle other); + MUST_USE_RESULT MaybeObject* Merge(int verbatim, + int valid, + int new_size, + int modify_index, + StoreMode store_mode, + DescriptorArray* other); bool IsMoreGeneralThan(int verbatim, int valid,