Index: src/crankshaft/hydrogen.cc |
diff --git a/src/crankshaft/hydrogen.cc b/src/crankshaft/hydrogen.cc |
index af23e6160954fd8c3fb5dc31eb6f68cf65f4ac80..b38d98c02e6478ec984dc760bf898d0ec73aaecf 100644 |
--- a/src/crankshaft/hydrogen.cc |
+++ b/src/crankshaft/hydrogen.cc |
@@ -6615,7 +6615,7 @@ HValue* HOptimizedGraphBuilder::BuildMonomorphicAccess( |
void HOptimizedGraphBuilder::HandlePolymorphicNamedFieldAccess( |
PropertyAccessType access_type, Expression* expr, FeedbackVectorSlot slot, |
BailoutId ast_id, BailoutId return_id, HValue* object, HValue* value, |
- SmallMapList* maps, Handle<String> name) { |
+ SmallMapList* maps, Handle<Name> name) { |
// Something did not match; must use a polymorphic load. |
int count = 0; |
HBasicBlock* join = NULL; |
@@ -7630,19 +7630,42 @@ HValue* HOptimizedGraphBuilder::HandleKeyedElementAccess( |
HValue* obj, HValue* key, HValue* val, Expression* expr, |
FeedbackVectorSlot slot, BailoutId ast_id, BailoutId return_id, |
PropertyAccessType access_type, bool* has_side_effects) { |
- if (key->ActualValue()->IsConstant()) { |
+ // A keyed name access with type feedback may contain the name. |
+ Handle<TypeFeedbackVector> vector = |
+ handle(current_feedback_vector(), isolate()); |
+ HValue* expected_key = key; |
+ if (!key->ActualValue()->IsConstant()) { |
+ Name* name = nullptr; |
+ if (access_type == LOAD) { |
+ KeyedLoadICNexus nexus(vector, slot); |
+ name = nexus.FindFirstName(); |
+ } else if (FLAG_vector_stores) { |
+ KeyedStoreICNexus nexus(vector, slot); |
+ name = nexus.FindFirstName(); |
+ } |
+ if (name != nullptr) { |
+ Handle<Name> handle_name(name); |
+ expected_key = Add<HConstant>(handle_name); |
+ // We need a check against the key. |
+ bool in_new_space = isolate()->heap()->InNewSpace(*handle_name); |
+ Unique<Name> unique_name = Unique<Name>::CreateUninitialized(handle_name); |
+ Add<HCheckValue>(key, unique_name, in_new_space); |
+ } |
+ } |
+ if (expected_key->ActualValue()->IsConstant()) { |
Handle<Object> constant = |
- HConstant::cast(key->ActualValue())->handle(isolate()); |
+ HConstant::cast(expected_key->ActualValue())->handle(isolate()); |
uint32_t array_index; |
- if (constant->IsString() && |
- !Handle<String>::cast(constant)->AsArrayIndex(&array_index)) { |
+ if ((constant->IsString() && |
+ !Handle<String>::cast(constant)->AsArrayIndex(&array_index)) || |
+ constant->IsSymbol()) { |
if (!constant->IsUniqueName()) { |
constant = isolate()->factory()->InternalizeString( |
Handle<String>::cast(constant)); |
} |
HValue* access = |
BuildNamedAccess(access_type, ast_id, return_id, expr, slot, obj, |
- Handle<String>::cast(constant), val, false); |
+ Handle<Name>::cast(constant), val, false); |
if (access == NULL || access->IsPhi() || |
HInstruction::cast(access)->IsLinked()) { |
*has_side_effects = false; |
@@ -7814,7 +7837,7 @@ bool HOptimizedGraphBuilder::TryArgumentsAccess(Property* expr) { |
HValue* HOptimizedGraphBuilder::BuildNamedAccess( |
PropertyAccessType access, BailoutId ast_id, BailoutId return_id, |
Expression* expr, FeedbackVectorSlot slot, HValue* object, |
- Handle<String> name, HValue* value, bool is_uninitialized) { |
+ Handle<Name> name, HValue* value, bool is_uninitialized) { |
SmallMapList* maps; |
ComputeReceiverTypes(expr, object, &maps, zone()); |
DCHECK(maps != NULL); |