| 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);
|
| }
|
|
|