| Index: src/ast.cc | 
| diff --git a/src/ast.cc b/src/ast.cc | 
| index 8b1d94176fb7c3b20068a0e8d530bf00c2922a48..c625f979eec0ddd14c55c189156cd142e56de806 100644 | 
| --- a/src/ast.cc | 
| +++ b/src/ast.cc | 
| @@ -181,21 +181,25 @@ void FunctionLiteral::InitializeSharedInfo( | 
|  | 
|  | 
| ObjectLiteralProperty::ObjectLiteralProperty( | 
| -    Zone* zone, Literal* key, Expression* value) { | 
| +    Zone* zone, Expression* key, Expression* value, bool is_computed_name) { | 
| emit_store_ = true; | 
| key_ = key; | 
| value_ = value; | 
| -  Handle<Object> k = key->value(); | 
| -  if (k->IsInternalizedString() && | 
| -      String::Equals(Handle<String>::cast(k), | 
| -                     zone->isolate()->factory()->proto_string())) { | 
| -    kind_ = PROTOTYPE; | 
| -  } else if (value_->AsMaterializedLiteral() != NULL) { | 
| -    kind_ = MATERIALIZED_LITERAL; | 
| -  } else if (value_->IsLiteral()) { | 
| -    kind_ = CONSTANT; | 
| +  if (is_computed_name) { | 
| +    kind_ = COMPUTED_NAME; | 
| } else { | 
| -    kind_ = COMPUTED; | 
| +    Handle<Object> k = key->AsLiteral()->value(); | 
| +    if (k->IsInternalizedString() && | 
| +        String::Equals(Handle<String>::cast(k), | 
| +                       zone->isolate()->factory()->proto_string())) { | 
| +      kind_ = PROTOTYPE; | 
| +    } else if (value_->AsMaterializedLiteral() != NULL) { | 
| +      kind_ = MATERIALIZED_LITERAL; | 
| +    } else if (value_->IsLiteral()) { | 
| +      kind_ = CONSTANT; | 
| +    } else { | 
| +      kind_ = COMPUTED; | 
| +    } | 
| } | 
| } | 
|  | 
| @@ -232,7 +236,8 @@ void ObjectLiteral::CalculateEmitStore(Zone* zone) { | 
| allocator); | 
| for (int i = properties()->length() - 1; i >= 0; i--) { | 
| ObjectLiteral::Property* property = properties()->at(i); | 
| -    Literal* literal = property->key(); | 
| +    if (property->kind() == ObjectLiteral::Property::COMPUTED_NAME) continue; | 
| +    Literal* literal = property->key()->AsLiteral(); | 
| if (literal->value()->IsNull()) continue; | 
| uint32_t hash = literal->Hash(); | 
| // If the key of a computed property is in the table, do not emit | 
| @@ -274,6 +279,14 @@ void ObjectLiteral::BuildConstantProperties(Isolate* isolate) { | 
| is_simple = false; | 
| continue; | 
| } | 
| + | 
| +    if (position == boilerplate_properties_ * 2) { | 
| +      // Constant properties stop at the first computed name. | 
| +      ASSERT(property->kind() == ObjectLiteral::Property::COMPUTED_NAME); | 
| +      break; | 
| +    } | 
| +    ASSERT(property->kind() != ObjectLiteral::Property::COMPUTED_NAME); | 
| + | 
| MaterializedLiteral* m_literal = property->value()->AsMaterializedLiteral(); | 
| if (m_literal != NULL) { | 
| m_literal->BuildConstants(isolate); | 
| @@ -283,7 +296,7 @@ void ObjectLiteral::BuildConstantProperties(Isolate* isolate) { | 
| // Add CONSTANT and COMPUTED properties to boilerplate. Use undefined | 
| // value for COMPUTED properties, the real value is filled in at | 
| // runtime. The enumeration order is maintained. | 
| -    Handle<Object> key = property->key()->value(); | 
| +    Handle<Object> key = property->key()->AsLiteral()->value(); | 
| Handle<Object> value = GetBoilerplateValue(property->value(), isolate); | 
|  | 
| // Ensure objects that may, at any point in time, contain fields with double | 
| @@ -632,7 +645,8 @@ void CallNew::RecordTypeFeedback(TypeFeedbackOracle* oracle) { | 
|  | 
|  | 
| void ObjectLiteral::Property::RecordTypeFeedback(TypeFeedbackOracle* oracle) { | 
| -  TypeFeedbackId id = key()->LiteralFeedbackId(); | 
| +  ASSERT(key()->IsLiteral()); | 
| +  TypeFeedbackId id = key()->AsLiteral()->LiteralFeedbackId(); | 
| SmallMapList maps; | 
| oracle->CollectReceiverTypes(id, &maps); | 
| receiver_type_ = maps.length() == 1 ? maps.at(0) | 
|  |