Index: src/ic/keyed-store-generic.cc |
diff --git a/src/ic/keyed-store-generic.cc b/src/ic/keyed-store-generic.cc |
index 81ce3a6a1fb2f957b3f03a993a767c49723758c1..a07d1e8743aaf73fa9a669646768515de9522edf 100644 |
--- a/src/ic/keyed-store-generic.cc |
+++ b/src/ic/keyed-store-generic.cc |
@@ -461,6 +461,8 @@ void KeyedStoreGenericAssembler::EmitGenericElementStore( |
// Out-of-capacity accesses (index >= capacity) jump here. Additionally, |
// an ElementsKind transition might be necessary. |
+ // The index can also be negative at this point! Jump to the runtime in that |
+ // case to convert it to a named property. |
Bind(&if_grow); |
{ |
Comment("Grow backing store"); |
@@ -727,21 +729,18 @@ void KeyedStoreGenericAssembler::EmitGenericPropertyStore( |
Bind(&stub_cache); |
{ |
Comment("stub cache probe"); |
+ // The stub cache lookup is opportunistic: if we find a handler, use it; |
+ // otherwise take the slow path. Since this is a generic stub, compiling |
+ // a handler (as KeyedStoreIC_Miss would do) is probably a waste of time. |
Variable var_handler(this, MachineRepresentation::kTagged); |
- Label found_handler(this, &var_handler), stub_cache_miss(this); |
+ Label found_handler(this, &var_handler); |
TryProbeStubCache(isolate()->store_stub_cache(), receiver, p->name, |
- &found_handler, &var_handler, &stub_cache_miss); |
+ &found_handler, &var_handler, slow); |
Bind(&found_handler); |
{ |
Comment("KeyedStoreGeneric found handler"); |
HandleStoreICHandlerCase(p, var_handler.value(), slow); |
} |
- Bind(&stub_cache_miss); |
- { |
- Comment("KeyedStoreGeneric_miss"); |
- TailCallRuntime(Runtime::kKeyedStoreIC_Miss, p->context, p->value, |
- p->slot, p->vector, p->receiver, p->name); |
- } |
} |
} |
@@ -756,6 +755,8 @@ void KeyedStoreGenericAssembler::KeyedStoreGeneric(LanguageMode language_mode) { |
Node* context = Parameter(Descriptor::kContext); |
Variable var_index(this, MachineType::PointerRepresentation()); |
+ Variable var_unique(this, MachineRepresentation::kTagged); |
+ var_unique.Bind(name); // Dummy initialization. |
Label if_index(this), if_unique_name(this), slow(this); |
GotoIf(TaggedIsSmi(receiver), &slow); |
@@ -767,7 +768,7 @@ void KeyedStoreGenericAssembler::KeyedStoreGeneric(LanguageMode language_mode) { |
Int32Constant(LAST_CUSTOM_ELEMENTS_RECEIVER)), |
&slow); |
- TryToName(name, &if_index, &var_index, &if_unique_name, &slow); |
+ TryToName(name, &if_index, &var_index, &if_unique_name, &var_unique, &slow); |
Bind(&if_index); |
{ |
@@ -779,8 +780,8 @@ void KeyedStoreGenericAssembler::KeyedStoreGeneric(LanguageMode language_mode) { |
Bind(&if_unique_name); |
{ |
Comment("key is unique name"); |
- KeyedStoreGenericAssembler::StoreICParameters p(context, receiver, name, |
- value, slot, vector); |
+ StoreICParameters p(context, receiver, var_unique.value(), value, slot, |
+ vector); |
EmitGenericPropertyStore(receiver, receiver_map, &p, &slow, language_mode); |
} |