| Index: src/ic.cc
|
| diff --git a/src/ic.cc b/src/ic.cc
|
| index 86a77fe3077bd3bfc1ab41f74711b1d98a816714..1e7997a80ddf6632633908c1e36f847ea752ebff 100644
|
| --- a/src/ic.cc
|
| +++ b/src/ic.cc
|
| @@ -1435,22 +1435,22 @@ Handle<Code> KeyedStoreIC::StoreElementStub(Handle<JSObject> receiver,
|
| KeyedStoreIC::GetKeyedAccessStoreMode(target()->extra_ic_state());
|
| Handle<Map> previous_receiver_map = target_receiver_maps.at(0);
|
| if (state() == MONOMORPHIC) {
|
| - // If the "old" and "new" maps are in the same elements map family, stay
|
| - // MONOMORPHIC and use the map for the most generic ElementsKind.
|
| Handle<Map> transitioned_receiver_map = receiver_map;
|
| if (IsTransitionStoreMode(store_mode)) {
|
| - transitioned_receiver_map =
|
| - ComputeTransitionedMap(receiver, store_mode);
|
| + transitioned_receiver_map = ComputeTransitionedMap(receiver, store_mode);
|
| }
|
| - if (IsTransitionOfMonomorphicTarget(
|
| + if (receiver_map.is_identical_to(previous_receiver_map) ||
|
| + IsTransitionOfMonomorphicTarget(
|
| MapToType<HeapType>(transitioned_receiver_map, isolate()))) {
|
| - // Element family is the same, use the "worst" case map.
|
| + // If the "old" and "new" maps are in the same elements map family, or
|
| + // if they at least come from the same origin for a transitioning store,
|
| + // stay MONOMORPHIC and use the map for the most generic ElementsKind.
|
| store_mode = GetNonTransitioningStoreMode(store_mode);
|
| return isolate()->stub_cache()->ComputeKeyedStoreElement(
|
| transitioned_receiver_map, strict_mode(), store_mode);
|
| } else if (*previous_receiver_map == receiver->map() &&
|
| old_store_mode == STANDARD_STORE &&
|
| - (IsGrowStoreMode(store_mode) ||
|
| + (store_mode == STORE_AND_GROW_NO_TRANSITION ||
|
| store_mode == STORE_NO_TRANSITION_IGNORE_OUT_OF_BOUNDS ||
|
| store_mode == STORE_NO_TRANSITION_HANDLE_COW)) {
|
| // A "normal" IC that handles stores can switch to a version that can
|
|
|