Index: src/hydrogen.cc |
diff --git a/src/hydrogen.cc b/src/hydrogen.cc |
index 3ce76c1ef19a2a2be7b70dac589a5ee5761a9fea..91f3842d5de4e30eeada1a261917439c27b96185 100644 |
--- a/src/hydrogen.cc |
+++ b/src/hydrogen.cc |
@@ -4792,7 +4792,10 @@ void HGraphBuilder::VisitObjectLiteral(ObjectLiteral* expr) { |
CHECK_ALIVE(VisitForValue(value)); |
HValue* value = Pop(); |
HInstruction* store; |
- CHECK_ALIVE(store = BuildStoreNamed(literal, value, property)); |
+ CHECK_ALIVE(store = BuildStoreNamed(literal, |
+ value, |
+ property->GetReceiverType(), |
+ property->key())); |
AddInstruction(store); |
if (store->HasObservableSideEffects()) AddSimulate(key->id()); |
} else { |
@@ -5030,14 +5033,13 @@ HInstruction* HGraphBuilder::BuildStoreNamedGeneric(HValue* object, |
HInstruction* HGraphBuilder::BuildStoreNamed(HValue* object, |
HValue* value, |
- ObjectLiteral::Property* prop) { |
- Literal* key = prop->key()->AsLiteral(); |
- Handle<String> name = Handle<String>::cast(key->handle()); |
+ Handle<Map> type, |
+ Expression* key) { |
+ Handle<String> name = Handle<String>::cast(key->AsLiteral()->handle()); |
ASSERT(!name.is_null()); |
LookupResult lookup(isolate()); |
- Handle<Map> type = prop->GetReceiverType(); |
- bool is_monomorphic = prop->IsMonomorphic() && |
+ bool is_monomorphic = !type.is_null() && |
ComputeLoadStoreField(type, name, &lookup, true); |
return is_monomorphic |
@@ -5047,28 +5049,6 @@ HInstruction* HGraphBuilder::BuildStoreNamed(HValue* object, |
} |
-HInstruction* HGraphBuilder::BuildStoreNamed(HValue* object, |
- HValue* value, |
- Expression* expr) { |
- Property* prop = (expr->AsProperty() != NULL) |
- ? expr->AsProperty() |
- : expr->AsAssignment()->target()->AsProperty(); |
- Literal* key = prop->key()->AsLiteral(); |
- Handle<String> name = Handle<String>::cast(key->handle()); |
- ASSERT(!name.is_null()); |
- |
- LookupResult lookup(isolate()); |
- SmallMapList* types = expr->GetReceiverTypes(); |
- bool is_monomorphic = expr->IsMonomorphic() && |
- ComputeLoadStoreField(types->first(), name, &lookup, true); |
- |
- return is_monomorphic |
- ? BuildStoreNamedField(object, name, value, types->first(), &lookup, |
- true) // Needs smi and map check. |
- : BuildStoreNamedGeneric(object, name, value); |
-} |
- |
- |
void HGraphBuilder::HandlePolymorphicLoadNamedField(Property* expr, |
HValue* object, |
SmallMapList* types, |
@@ -5220,7 +5200,10 @@ void HGraphBuilder::HandlePropertyAssignment(Assignment* expr) { |
SmallMapList* types = expr->GetReceiverTypes(); |
if (expr->IsMonomorphic()) { |
- CHECK_ALIVE(instr = BuildStoreNamed(object, value, expr)); |
+ CHECK_ALIVE(instr = BuildStoreNamed(object, |
+ value, |
+ types->first(), |
+ prop->key())); |
} else if (types != NULL && types->length() > 1) { |
HandlePolymorphicStoreNamedField(expr, object, value, types, name); |
@@ -5380,10 +5363,11 @@ void HGraphBuilder::HandleCompoundAssignment(Assignment* expr) { |
CHECK_ALIVE(VisitForValue(prop->obj())); |
HValue* obj = Top(); |
- HInstruction* load = NULL; |
+ Handle<Map> map; |
+ HInstruction* load; |
if (prop->IsMonomorphic()) { |
Handle<String> name = prop->key()->AsLiteral()->AsPropertyName(); |
- Handle<Map> map = prop->GetReceiverTypes()->first(); |
+ map = prop->GetReceiverTypes()->first(); |
load = BuildLoadNamed(obj, prop, map, name); |
} else { |
load = BuildLoadNamedGeneric(obj, prop); |
@@ -5400,7 +5384,7 @@ void HGraphBuilder::HandleCompoundAssignment(Assignment* expr) { |
if (instr->HasObservableSideEffects()) AddSimulate(operation->id()); |
HInstruction* store; |
- CHECK_ALIVE(store = BuildStoreNamed(obj, instr, prop)); |
+ CHECK_ALIVE(store = BuildStoreNamed(obj, instr, map, prop->key())); |
AddInstruction(store); |
// Drop the simulated receiver and value. Return the value. |
Drop(2); |
@@ -7786,10 +7770,11 @@ void HGraphBuilder::VisitCountOperation(CountOperation* expr) { |
CHECK_ALIVE(VisitForValue(prop->obj())); |
HValue* obj = Top(); |
- HInstruction* load = NULL; |
+ Handle<Map> map; |
+ HInstruction* load; |
if (prop->IsMonomorphic()) { |
Handle<String> name = prop->key()->AsLiteral()->AsPropertyName(); |
- Handle<Map> map = prop->GetReceiverTypes()->first(); |
+ map = prop->GetReceiverTypes()->first(); |
load = BuildLoadNamed(obj, prop, map, name); |
} else { |
load = BuildLoadNamedGeneric(obj, prop); |
@@ -7801,7 +7786,7 @@ void HGraphBuilder::VisitCountOperation(CountOperation* expr) { |
input = Pop(); |
HInstruction* store; |
- CHECK_ALIVE(store = BuildStoreNamed(obj, after, prop)); |
+ CHECK_ALIVE(store = BuildStoreNamed(obj, after, map, prop->key())); |
AddInstruction(store); |
// Overwrite the receiver in the bailout environment with the result |