Index: src/ic.cc |
diff --git a/src/ic.cc b/src/ic.cc |
index b77cb7d681c93b96e1da744913dd1e90cdbb1d09..67c322ebeb8d5717ac7fa6968a6abf5372c2f4e8 100644 |
--- a/src/ic.cc |
+++ b/src/ic.cc |
@@ -1771,6 +1771,26 @@ Handle<Code> KeyedStoreIC::StoreElementStub(Handle<JSObject> receiver, |
} |
} |
+ // If the store mode isn't the standard mode, make sure that all polymorphic |
+ // receivers are either external arrays, or all "normal" arrays. Otherwise, |
+ // use the generic stub. |
+ if (store_mode != STANDARD_STORE) { |
+ int external_arrays = 0; |
+ for (int i = 0; i < target_receiver_maps.length(); ++i) { |
+ if (target_receiver_maps[i]->has_external_array_elements()) { |
+ external_arrays++; |
+ } |
+ } |
+ if (external_arrays != 0 && |
+ external_arrays != target_receiver_maps.length()) { |
+ TRACE_GENERIC_IC(isolate(), "KeyedIC", |
+ "unsupported combination of external and normal arrays"); |
+ return strict_mode == kStrictMode |
+ ? generic_stub_strict() |
+ : generic_stub(); |
+ } |
+ } |
+ |
return isolate()->stub_cache()->ComputeStoreElementPolymorphic( |
&target_receiver_maps, store_mode, strict_mode); |
} |