Index: src/stub-cache.cc |
diff --git a/src/stub-cache.cc b/src/stub-cache.cc |
index 396e92ce39a6601295a6632de73088a0e05fec2f..ae427ee8c9316b332986c8bc08ee28d305a58a95 100644 |
--- a/src/stub-cache.cc |
+++ b/src/stub-cache.cc |
@@ -421,7 +421,15 @@ Handle<Code> StubCache::ComputeStoreTransition(Handle<Name> name, |
StrictModeFlag strict_mode) { |
Handle<Code> stub = FindIC( |
name, receiver, Code::STORE_IC, Code::MAP_TRANSITION, strict_mode); |
- if (!stub.is_null()) return stub; |
+ if (!stub.is_null()) { |
+ MapHandleList embedded_maps; |
+ stub->FindAllMaps(&embedded_maps); |
+ for (int i = 0; i < embedded_maps.length(); i++) { |
+ if (embedded_maps.at(i).is_identical_to(transition)) { |
+ return stub; |
+ } |
+ } |
+ } |
StoreStubCompiler compiler(isolate_, strict_mode); |
Handle<Code> code = |
@@ -570,7 +578,15 @@ Handle<Code> StubCache::ComputeKeyedStoreTransition( |
StrictModeFlag strict_mode) { |
Handle<Code> stub = FindIC( |
name, receiver, Code::KEYED_STORE_IC, Code::MAP_TRANSITION, strict_mode); |
- if (!stub.is_null()) return stub; |
+ if (!stub.is_null()) { |
+ MapHandleList embedded_maps; |
+ stub->FindAllMaps(&embedded_maps); |
+ for (int i = 0; i < embedded_maps.length(); i++) { |
+ if (embedded_maps.at(i).is_identical_to(transition)) { |
+ return stub; |
+ } |
+ } |
+ } |
KeyedStoreStubCompiler compiler(isolate(), strict_mode, STANDARD_STORE); |
Handle<Code> code = |
@@ -917,10 +933,11 @@ Handle<Code> StubCache::ComputeLoadElementPolymorphic( |
Handle<Code> StubCache::ComputePolymorphicIC(MapHandleList* receiver_maps, |
CodeHandleList* handlers, |
+ int number_of_valid_maps, |
Handle<Name> name) { |
LoadStubCompiler ic_compiler(isolate_); |
- Code::StubType type = handlers->length() == 1 ? handlers->at(0)->type() |
- : Code::NORMAL; |
+ Code::StubType type = number_of_valid_maps == 1 ? handlers->at(0)->type() |
+ : Code::NORMAL; |
Handle<Code> ic = ic_compiler.CompilePolymorphicIC( |
receiver_maps, handlers, name, type, PROPERTY); |
return ic; |