Index: src/ic/keyed-store-generic.cc |
diff --git a/src/ic/keyed-store-generic.cc b/src/ic/keyed-store-generic.cc |
index cf1c49f0c897304788c7134572b5413eb062fa05..549bb6af39fabd4be9e7005492256700e246a108 100644 |
--- a/src/ic/keyed-store-generic.cc |
+++ b/src/ic/keyed-store-generic.cc |
@@ -452,6 +452,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"); |
@@ -747,6 +749,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); |
@@ -758,7 +762,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); |
{ |
@@ -770,8 +774,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); |
} |