From: verwaest Date: Wed, 15 Jul 2015 12:13:04 +0000 (-0700) Subject: Simplify PrepareForDataProperty in the IsElement case X-Git-Tag: upstream/4.7.83~1362 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=e5c2a69637cae21bf42da1589edcc48c90eeef10;p=platform%2Fupstream%2Fv8.git Simplify PrepareForDataProperty in the IsElement case BUG=v8:4137 LOG=n Review URL: https://codereview.chromium.org/1237953002 Cr-Commit-Position: refs/heads/master@{#29678} --- diff --git a/src/lookup.cc b/src/lookup.cc index e63e8f148..7d9f79168 100644 --- a/src/lookup.cc +++ b/src/lookup.cc @@ -132,29 +132,15 @@ void LookupIterator::PrepareForDataProperty(Handle value) { Handle holder = GetHolder(); if (IsElement()) { - ElementsKind old_kind = holder_map_->elements_kind(); - holder_map_ = Map::PrepareForDataElement(holder_map_, value); - ElementsKind new_kind = holder_map_->elements_kind(); - if (new_kind != old_kind) { - // TODO(verwaest): Handle element migration in MigrateToMap. - JSObject::UpdateAllocationSite(holder, new_kind); - if (IsFastDoubleElementsKind(old_kind) != - IsFastDoubleElementsKind(new_kind)) { - uint32_t capacity = holder->elements()->length(); - ElementsAccessor* accessor = ElementsAccessor::ForKind(new_kind); - accessor->GrowCapacityAndConvert(holder, capacity); - // GrowCapacityAndConvert migrated the object. No reloading of property - // infomation is necessary for elements. - return; - } else if (FLAG_trace_elements_transitions) { - Handle elements(holder->elements()); - JSObject::PrintElementsTransition(stdout, holder, old_kind, elements, - new_kind, elements); - } - } + ElementsKind kind = holder_map_->elements_kind(); + ElementsKind to = value->OptimalElementsKind(); + if (IsHoleyElementsKind(kind)) to = GetHoleyElementsKind(to); + to = IsMoreGeneralElementsKindTransition(kind, to) ? to : kind; + JSObject::TransitionElementsKind(holder, to); + holder_map_ = handle(holder->map(), isolate_); // Copy the backing store if it is copy-on-write. - if (IsFastSmiOrObjectElementsKind(new_kind)) { + if (IsFastSmiOrObjectElementsKind(to)) { JSObject::EnsureWritableFastElements(holder); } diff --git a/src/objects-inl.h b/src/objects-inl.h index b21724583..4f1ad414e 100644 --- a/src/objects-inl.h +++ b/src/objects-inl.h @@ -695,8 +695,7 @@ bool Object::IsJSReceiver() const { bool Object::IsJSObject() const { STATIC_ASSERT(LAST_JS_OBJECT_TYPE == LAST_TYPE); - return IsHeapObject() && - HeapObject::cast(this)->map()->instance_type() >= FIRST_JS_OBJECT_TYPE; + return IsHeapObject() && HeapObject::cast(this)->map()->IsJSObjectMap(); } diff --git a/src/objects.cc b/src/objects.cc index 34e825945..b4c8a528f 100644 --- a/src/objects.cc +++ b/src/objects.cc @@ -6947,43 +6947,6 @@ bool DescriptorArray::CanHoldValue(int descriptor, Object* value) { } -// static -Handle Map::PrepareForDataElement(Handle map, Handle value) { - ElementsKind kind = map->elements_kind(); - bool holey = IsHoleyElementsKind(kind); - - switch (kind) { - case FAST_SMI_ELEMENTS: - case FAST_HOLEY_SMI_ELEMENTS: - if (value->IsSmi()) return map; - kind = value->IsNumber() ? FAST_DOUBLE_ELEMENTS : FAST_ELEMENTS; - break; - - case FAST_DOUBLE_ELEMENTS: - case FAST_HOLEY_DOUBLE_ELEMENTS: - if (value->IsNumber()) return map; - kind = FAST_ELEMENTS; - break; - - case FAST_ELEMENTS: - case FAST_HOLEY_ELEMENTS: - case DICTIONARY_ELEMENTS: - case FAST_SLOPPY_ARGUMENTS_ELEMENTS: - case SLOW_SLOPPY_ARGUMENTS_ELEMENTS: -#define TYPED_ARRAY_CASE(Type, type, TYPE, ctype, size) \ - case EXTERNAL_##TYPE##_ELEMENTS: \ - case TYPE##_ELEMENTS: - - TYPED_ARRAYS(TYPED_ARRAY_CASE) -#undef TYPED_ARRAY_CASE - return map; - } - - if (holey) kind = GetHoleyElementsKind(kind); - return Map::AsElementsKind(map, kind); -} - - // static Handle Map::PrepareForDataProperty(Handle map, int descriptor, Handle value) { diff --git a/src/objects.h b/src/objects.h index 78bbc9916..0af8de1d3 100644 --- a/src/objects.h +++ b/src/objects.h @@ -5765,8 +5765,6 @@ class Map: public HeapObject { static Handle PrepareForDataProperty(Handle old_map, int descriptor_number, Handle value); - static Handle PrepareForDataElement(Handle old_map, - Handle value); static Handle Normalize(Handle map, PropertyNormalizationMode mode, const char* reason); @@ -6029,6 +6027,7 @@ class Map: public HeapObject { bool IsJSObjectMap() { return instance_type() >= FIRST_JS_OBJECT_TYPE; } + bool IsJSArrayMap() { return instance_type() == JS_ARRAY_TYPE; } bool IsStringMap() { return instance_type() < FIRST_NONSTRING_TYPE; } bool IsJSProxyMap() { InstanceType type = instance_type();