Index: src/stub-cache.cc |
diff --git a/src/stub-cache.cc b/src/stub-cache.cc |
index 9a2ca0256a2d99cb8a29138911820faa16d8512a..68d0c3a2cbb0730779443d58201ad1becd917743 100644 |
--- a/src/stub-cache.cc |
+++ b/src/stub-cache.cc |
@@ -441,7 +441,9 @@ Handle<Code> StubCache::ComputeKeyedStoreElement( |
Code::KEYED_STORE_IC, extra_state); |
ASSERT(store_mode == STANDARD_STORE || |
- store_mode == STORE_AND_GROW_NO_TRANSITION); |
+ store_mode == STORE_AND_GROW_NO_TRANSITION || |
+ store_mode == STORE_NO_TRANSITION_IGNORE_OUT_OF_BOUNDS || |
+ store_mode == STORE_NO_TRANSITION_HANDLE_COW); |
Handle<String> name = |
isolate()->factory()->KeyedStoreElementMonomorphic_string(); |
@@ -899,7 +901,9 @@ Handle<Code> StubCache::ComputeStoreElementPolymorphic( |
KeyedAccessStoreMode store_mode, |
StrictModeFlag strict_mode) { |
ASSERT(store_mode == STANDARD_STORE || |
- store_mode == STORE_AND_GROW_NO_TRANSITION); |
+ store_mode == STORE_AND_GROW_NO_TRANSITION || |
+ store_mode == STORE_NO_TRANSITION_IGNORE_OUT_OF_BOUNDS || |
+ store_mode == STORE_NO_TRANSITION_HANDLE_COW); |
Handle<PolymorphicCodeCache> cache = |
isolate_->factory()->polymorphic_code_cache(); |
Code::ExtraICState extra_state = Code::ComputeExtraICState(store_mode, |
@@ -1744,10 +1748,19 @@ Handle<Code> KeyedStoreStubCompiler::CompileStoreElementPolymorphic( |
strict_mode(), |
store_mode_).GetCode(isolate()); |
} else { |
- cached_stub = KeyedStoreElementStub( |
- is_js_array, |
- elements_kind, |
- store_mode_).GetCode(isolate()); |
+ if (FLAG_compiled_keyed_stores && |
+ (receiver_map->has_fast_elements() || |
+ receiver_map->has_external_array_elements())) { |
+ cached_stub = KeyedStoreFastElementStub( |
+ is_js_array, |
+ elements_kind, |
+ store_mode_).GetCode(isolate()); |
+ } else { |
+ cached_stub = KeyedStoreElementStub( |
+ is_js_array, |
+ elements_kind, |
+ store_mode_).GetCode(isolate()); |
+ } |
} |
ASSERT(!cached_stub.is_null()); |
handlers.Add(cached_stub); |