Reviewers: Igor Sheludko,

Message:
ptal

Description:
Simplify PrepareForDataProperty in the IsElement case

BUG=v8:4137
LOG=n

Please review this at https://codereview.chromium.org/1237953002/

Base URL: https://chromium.googlesource.com/v8/v8.git@master

Affected files (+12, -61 lines):
  M src/lookup.cc
  M src/objects.h
  M src/objects.cc
  M src/objects-inl.h


Index: src/lookup.cc
diff --git a/src/lookup.cc b/src/lookup.cc
index 3acc6e2a00ed76825174a5e4e5f9e3ed46b2274d..d96671c0a5ca4f4a96e4b11b419e5052621bf7de 100644
--- a/src/lookup.cc
+++ b/src/lookup.cc
@@ -132,29 +132,19 @@ void LookupIterator::PrepareForDataProperty(Handle<Object> value) {
   Handle<JSObject> holder = GetHolder<JSObject>();

   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<FixedArrayBase> 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) || !holder_map_->IsJSArrayMap()) {
+      to = GetHoleyElementsKind(to);
+      kind = GetHoleyElementsKind(kind);
     }
+    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);
     }

Index: src/objects-inl.h
diff --git a/src/objects-inl.h b/src/objects-inl.h
index 857270f674a288cec36cb450b0f6e204e0c1a175..188722e62814e655b73ec21039b769a64bcf157f 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();
 }


Index: src/objects.cc
diff --git a/src/objects.cc b/src/objects.cc
index 0eefbec2ab7fb568312a7282649ebb5b9d9bfbfa..a202320357cb8ee39e66355adf948fece8fc9e20 100644
--- a/src/objects.cc
+++ b/src/objects.cc
@@ -6960,43 +6960,6 @@ bool DescriptorArray::CanHoldValue(int descriptor, Object* value) {


 // static
-Handle<Map> Map::PrepareForDataElement(Handle<Map> map, Handle<Object> 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> Map::PrepareForDataProperty(Handle<Map> map, int descriptor,
                                         Handle<Object> value) {
   // Dictionaries can store any property value.
Index: src/objects.h
diff --git a/src/objects.h b/src/objects.h
index fa4d66903ca8d6fbeabfc699d6a8a7ebbcabcf0f..37c03057eede89ca42b1ec2b8059b228ca5b6b68 100644
--- a/src/objects.h
+++ b/src/objects.h
@@ -5766,8 +5766,6 @@ class Map: public HeapObject {
   static Handle<Map> PrepareForDataProperty(Handle<Map> old_map,
                                             int descriptor_number,
                                             Handle<Object> value);
-  static Handle<Map> PrepareForDataElement(Handle<Map> old_map,
-                                           Handle<Object> value);

static Handle<Map> Normalize(Handle<Map> map, PropertyNormalizationMode mode,
                                const char* reason);
@@ -6030,6 +6028,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();


--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
--- You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to