Index: src/ic/ic.cc |
diff --git a/src/ic/ic.cc b/src/ic/ic.cc |
index 4ed85d58427f3b47d2f534202551c77ebe4e7130..373aec718f4bc85335d6c1a105de4212957ec91a 100644 |
--- a/src/ic/ic.cc |
+++ b/src/ic/ic.cc |
@@ -1972,22 +1972,20 @@ Handle<Code> KeyedStoreIC::StoreElementStub(Handle<JSObject> receiver, |
Handle<Map> KeyedStoreIC::ComputeTransitionedMap( |
Handle<Map> map, KeyedAccessStoreMode store_mode) { |
switch (store_mode) { |
- case STORE_TRANSITION_SMI_TO_OBJECT: |
- case STORE_TRANSITION_DOUBLE_TO_OBJECT: |
- case STORE_AND_GROW_TRANSITION_SMI_TO_OBJECT: |
- case STORE_AND_GROW_TRANSITION_DOUBLE_TO_OBJECT: |
- return Map::TransitionElementsTo(map, FAST_ELEMENTS); |
- case STORE_TRANSITION_SMI_TO_DOUBLE: |
- case STORE_AND_GROW_TRANSITION_SMI_TO_DOUBLE: |
- return Map::TransitionElementsTo(map, FAST_DOUBLE_ELEMENTS); |
- case STORE_TRANSITION_HOLEY_SMI_TO_OBJECT: |
- case STORE_TRANSITION_HOLEY_DOUBLE_TO_OBJECT: |
- case STORE_AND_GROW_TRANSITION_HOLEY_SMI_TO_OBJECT: |
- case STORE_AND_GROW_TRANSITION_HOLEY_DOUBLE_TO_OBJECT: |
- return Map::TransitionElementsTo(map, FAST_HOLEY_ELEMENTS); |
- case STORE_TRANSITION_HOLEY_SMI_TO_DOUBLE: |
- case STORE_AND_GROW_TRANSITION_HOLEY_SMI_TO_DOUBLE: |
- return Map::TransitionElementsTo(map, FAST_HOLEY_DOUBLE_ELEMENTS); |
+ case STORE_TRANSITION_TO_OBJECT: |
+ case STORE_AND_GROW_TRANSITION_TO_OBJECT: { |
+ ElementsKind kind = IsFastHoleyElementsKind(map->elements_kind()) |
+ ? FAST_HOLEY_ELEMENTS |
+ : FAST_ELEMENTS; |
+ return Map::TransitionElementsTo(map, kind); |
+ } |
+ case STORE_TRANSITION_TO_DOUBLE: |
+ case STORE_AND_GROW_TRANSITION_TO_DOUBLE: { |
+ ElementsKind kind = IsFastHoleyElementsKind(map->elements_kind()) |
+ ? FAST_HOLEY_DOUBLE_ELEMENTS |
+ : FAST_DOUBLE_ELEMENTS; |
+ return Map::TransitionElementsTo(map, kind); |
+ } |
case STORE_NO_TRANSITION_IGNORE_OUT_OF_BOUNDS: |
DCHECK(map->has_fixed_typed_array_elements()); |
// Fall through |
@@ -2023,26 +2021,14 @@ static KeyedAccessStoreMode GetStoreMode(Handle<JSObject> receiver, |
// Handle growing array in stub if necessary. |
if (receiver->HasFastSmiElements()) { |
if (value->IsHeapNumber()) { |
- if (receiver->HasFastHoleyElements()) { |
- return STORE_AND_GROW_TRANSITION_HOLEY_SMI_TO_DOUBLE; |
- } else { |
- return STORE_AND_GROW_TRANSITION_SMI_TO_DOUBLE; |
- } |
+ return STORE_AND_GROW_TRANSITION_TO_DOUBLE; |
} |
if (value->IsHeapObject()) { |
- if (receiver->HasFastHoleyElements()) { |
- return STORE_AND_GROW_TRANSITION_HOLEY_SMI_TO_OBJECT; |
- } else { |
- return STORE_AND_GROW_TRANSITION_SMI_TO_OBJECT; |
- } |
+ return STORE_AND_GROW_TRANSITION_TO_OBJECT; |
} |
} else if (receiver->HasFastDoubleElements()) { |
if (!value->IsSmi() && !value->IsHeapNumber()) { |
- if (receiver->HasFastHoleyElements()) { |
- return STORE_AND_GROW_TRANSITION_HOLEY_DOUBLE_TO_OBJECT; |
- } else { |
- return STORE_AND_GROW_TRANSITION_DOUBLE_TO_OBJECT; |
- } |
+ return STORE_AND_GROW_TRANSITION_TO_OBJECT; |
} |
} |
return STORE_AND_GROW_NO_TRANSITION; |
@@ -2050,25 +2036,13 @@ static KeyedAccessStoreMode GetStoreMode(Handle<JSObject> receiver, |
// Handle only in-bounds elements accesses. |
if (receiver->HasFastSmiElements()) { |
if (value->IsHeapNumber()) { |
- if (receiver->HasFastHoleyElements()) { |
- return STORE_TRANSITION_HOLEY_SMI_TO_DOUBLE; |
- } else { |
- return STORE_TRANSITION_SMI_TO_DOUBLE; |
- } |
+ return STORE_TRANSITION_TO_DOUBLE; |
} else if (value->IsHeapObject()) { |
- if (receiver->HasFastHoleyElements()) { |
- return STORE_TRANSITION_HOLEY_SMI_TO_OBJECT; |
- } else { |
- return STORE_TRANSITION_SMI_TO_OBJECT; |
- } |
+ return STORE_TRANSITION_TO_OBJECT; |
} |
} else if (receiver->HasFastDoubleElements()) { |
if (!value->IsSmi() && !value->IsHeapNumber()) { |
- if (receiver->HasFastHoleyElements()) { |
- return STORE_TRANSITION_HOLEY_DOUBLE_TO_OBJECT; |
- } else { |
- return STORE_TRANSITION_DOUBLE_TO_OBJECT; |
- } |
+ return STORE_TRANSITION_TO_OBJECT; |
} |
} |
if (!FLAG_trace_external_array_abuse && |