| Index: src/ic.cc
|
| diff --git a/src/ic.cc b/src/ic.cc
|
| index 9772b94a98fe50ff31db1ec54271630cb35ce701..134ef8b843fbff585aa05ada077b5a919eca7a06 100644
|
| --- a/src/ic.cc
|
| +++ b/src/ic.cc
|
| @@ -1644,8 +1644,7 @@ Handle<Code> KeyedIC::ComputeMonomorphicStubWithoutMapCheck(
|
| return string_stub();
|
| } else {
|
| ASSERT(receiver_map->has_dictionary_elements() ||
|
| - receiver_map->has_fast_elements() ||
|
| - receiver_map->has_fast_smi_only_elements() ||
|
| + receiver_map->has_fast_smi_or_object_elements() ||
|
| receiver_map->has_fast_double_elements() ||
|
| receiver_map->has_external_array_elements());
|
| bool is_js_array = receiver_map->instance_type() == JS_ARRAY_TYPE;
|
| @@ -1660,8 +1659,7 @@ Handle<Code> KeyedIC::ComputeMonomorphicStub(Handle<JSObject> receiver,
|
| StubKind stub_kind,
|
| StrictModeFlag strict_mode,
|
| Handle<Code> generic_stub) {
|
| - if (receiver->HasFastElements() ||
|
| - receiver->HasFastSmiOnlyElements() ||
|
| + if (receiver->HasFastSmiOrObjectElements() ||
|
| receiver->HasExternalArrayElements() ||
|
| receiver->HasFastDoubleElements() ||
|
| receiver->HasDictionaryElements()) {
|
| @@ -1681,15 +1679,26 @@ Handle<Map> KeyedIC::ComputeTransitionedMap(Handle<JSObject> receiver,
|
| case KeyedIC::STORE_AND_GROW_TRANSITION_SMI_TO_OBJECT:
|
| case KeyedIC::STORE_AND_GROW_TRANSITION_DOUBLE_TO_OBJECT:
|
| return JSObject::GetElementsTransitionMap(receiver, FAST_ELEMENTS);
|
| - break;
|
| case KeyedIC::STORE_TRANSITION_SMI_TO_DOUBLE:
|
| case KeyedIC::STORE_AND_GROW_TRANSITION_SMI_TO_DOUBLE:
|
| return JSObject::GetElementsTransitionMap(receiver, FAST_DOUBLE_ELEMENTS);
|
| - break;
|
| - default:
|
| + case KeyedIC::STORE_TRANSITION_HOLEY_SMI_TO_OBJECT:
|
| + case KeyedIC::STORE_TRANSITION_HOLEY_DOUBLE_TO_OBJECT:
|
| + case KeyedIC::STORE_AND_GROW_TRANSITION_HOLEY_SMI_TO_OBJECT:
|
| + case KeyedIC::STORE_AND_GROW_TRANSITION_HOLEY_DOUBLE_TO_OBJECT:
|
| + return JSObject::GetElementsTransitionMap(receiver,
|
| + FAST_HOLEY_ELEMENTS);
|
| + case KeyedIC::STORE_TRANSITION_HOLEY_SMI_TO_DOUBLE:
|
| + case KeyedIC::STORE_AND_GROW_TRANSITION_HOLEY_SMI_TO_DOUBLE:
|
| + return JSObject::GetElementsTransitionMap(receiver,
|
| + FAST_HOLEY_DOUBLE_ELEMENTS);
|
| + case KeyedIC::LOAD:
|
| + case KeyedIC::STORE_NO_TRANSITION:
|
| + case KeyedIC::STORE_AND_GROW_NO_TRANSITION:
|
| UNREACHABLE();
|
| - return Handle<Map>::null();
|
| + break;
|
| }
|
| + return Handle<Map>::null();
|
| }
|
|
|
|
|
| @@ -1749,30 +1758,54 @@ KeyedIC::StubKind KeyedStoreIC::GetStubKind(Handle<JSObject> receiver,
|
|
|
| if (allow_growth) {
|
| // Handle growing array in stub if necessary.
|
| - if (receiver->HasFastSmiOnlyElements()) {
|
| + if (receiver->HasFastSmiElements()) {
|
| if (value->IsHeapNumber()) {
|
| - return STORE_AND_GROW_TRANSITION_SMI_TO_DOUBLE;
|
| + if (receiver->HasFastHoleyElements()) {
|
| + return STORE_AND_GROW_TRANSITION_HOLEY_SMI_TO_DOUBLE;
|
| + } else {
|
| + return STORE_AND_GROW_TRANSITION_SMI_TO_DOUBLE;
|
| + }
|
| }
|
| if (value->IsHeapObject()) {
|
| - return STORE_AND_GROW_TRANSITION_SMI_TO_OBJECT;
|
| + if (receiver->HasFastHoleyElements()) {
|
| + return STORE_AND_GROW_TRANSITION_HOLEY_SMI_TO_OBJECT;
|
| + } else {
|
| + return STORE_AND_GROW_TRANSITION_SMI_TO_OBJECT;
|
| + }
|
| }
|
| } else if (receiver->HasFastDoubleElements()) {
|
| if (!value->IsSmi() && !value->IsHeapNumber()) {
|
| - return STORE_AND_GROW_TRANSITION_DOUBLE_TO_OBJECT;
|
| + 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_NO_TRANSITION;
|
| } else {
|
| // Handle only in-bounds elements accesses.
|
| - if (receiver->HasFastSmiOnlyElements()) {
|
| + if (receiver->HasFastSmiElements()) {
|
| if (value->IsHeapNumber()) {
|
| - return STORE_TRANSITION_SMI_TO_DOUBLE;
|
| + if (receiver->HasFastHoleyElements()) {
|
| + return STORE_TRANSITION_HOLEY_SMI_TO_DOUBLE;
|
| + } else {
|
| + return STORE_TRANSITION_SMI_TO_DOUBLE;
|
| + }
|
| } else if (value->IsHeapObject()) {
|
| - return STORE_TRANSITION_SMI_TO_OBJECT;
|
| + if (receiver->HasFastHoleyElements()) {
|
| + return STORE_TRANSITION_HOLEY_SMI_TO_OBJECT;
|
| + } else {
|
| + return STORE_TRANSITION_SMI_TO_OBJECT;
|
| + }
|
| }
|
| } else if (receiver->HasFastDoubleElements()) {
|
| if (!value->IsSmi() && !value->IsHeapNumber()) {
|
| - return STORE_TRANSITION_DOUBLE_TO_OBJECT;
|
| + if (receiver->HasFastHoleyElements()) {
|
| + return STORE_TRANSITION_HOLEY_DOUBLE_TO_OBJECT;
|
| + } else {
|
| + return STORE_TRANSITION_DOUBLE_TO_OBJECT;
|
| + }
|
| }
|
| }
|
| return STORE_NO_TRANSITION;
|
|
|