Index: src/ic.cc |
diff --git a/src/ic.cc b/src/ic.cc |
index 9e30aeaf3a77e8c9fda86b37b02b5b23dac0d40d..db3e0c789d4f60b686842d4c41840cdacf9f6518 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) { |
+ Handle<Map> transitioned_receiver_map = receiver_map; |
if (IsTransitionStoreMode(store_mode)) { |
+ transitioned_receiver_map = ComputeTransitionedMap(receiver, store_mode); |
+ } |
+ if (receiver_map.is_identical_to(previous_receiver_map) || |
+ IsTransitionOfMonomorphicTarget( |
+ MapToType<HeapType>(transitioned_receiver_map, isolate()))) { |
// 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. |
- Handle<Map> transitioned_receiver_map = |
- ComputeTransitionedMap(receiver, store_mode); |
- if (*previous_receiver_map == receiver->map() || |
- IsTransitionOfMonomorphicTarget( |
- MapToType<HeapType>(transitioned_receiver_map, isolate()))) { |
- store_mode = GetNonTransitioningStoreMode(store_mode); |
- return isolate()->stub_cache()->ComputeKeyedStoreElement( |
- transitioned_receiver_map, strict_mode(), store_mode); |
- } |
+ 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 |