| Index: src/ast.cc | 
| diff --git a/src/ast.cc b/src/ast.cc | 
| index 6329371faa5f01736b49d7f8686ad7f4ceaa373b..298cd23c5b992e9d8661223607bea7168f392a61 100644 | 
| --- a/src/ast.cc | 
| +++ b/src/ast.cc | 
| @@ -185,13 +185,17 @@ void FunctionLiteral::InitializeSharedInfo( | 
|  | 
| ObjectLiteralProperty::ObjectLiteralProperty(Zone* zone, | 
| AstValueFactory* ast_value_factory, | 
| -                                             Literal* key, Expression* value, | 
| -                                             bool is_static) { | 
| -  emit_store_ = true; | 
| -  key_ = key; | 
| -  value_ = value; | 
| -  is_static_ = is_static; | 
| -  if (key->raw_value()->EqualsString(ast_value_factory->proto_string())) { | 
| +                                             Expression* key, Expression* value, | 
| +                                             bool is_static, | 
| +                                             bool is_computed_name) | 
| +    : key_(key), | 
| +      value_(value), | 
| +      emit_store_(true), | 
| +      is_static_(is_static), | 
| +      is_computed_name_(is_computed_name) { | 
| +  if (!is_computed_name && | 
| +      key->AsLiteral()->raw_value()->EqualsString( | 
| +          ast_value_factory->proto_string())) { | 
| kind_ = PROTOTYPE; | 
| } else if (value_->AsMaterializedLiteral() != NULL) { | 
| kind_ = MATERIALIZED_LITERAL; | 
| @@ -204,13 +208,16 @@ ObjectLiteralProperty::ObjectLiteralProperty(Zone* zone, | 
|  | 
|  | 
| ObjectLiteralProperty::ObjectLiteralProperty(Zone* zone, bool is_getter, | 
| +                                             Expression* key, | 
| FunctionLiteral* value, | 
| -                                             bool is_static) { | 
| -  emit_store_ = true; | 
| -  value_ = value; | 
| -  kind_ = is_getter ? GETTER : SETTER; | 
| -  is_static_ = is_static; | 
| -} | 
| +                                             bool is_static, | 
| +                                             bool is_computed_name) | 
| +    : key_(key), | 
| +      value_(value), | 
| +      kind_(is_getter ? GETTER : SETTER), | 
| +      emit_store_(true), | 
| +      is_static_(is_static), | 
| +      is_computed_name_(is_computed_name) {} | 
|  | 
|  | 
| bool ObjectLiteral::Property::IsCompileTimeValue() { | 
| @@ -237,10 +244,11 @@ 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->is_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 | 
| +    // If the key of a computed property value is in the table, do not emit | 
| // a store for the property later. | 
| if ((property->kind() == ObjectLiteral::Property::MATERIALIZED_LITERAL || | 
| property->kind() == ObjectLiteral::Property::COMPUTED) && | 
| @@ -279,6 +287,13 @@ void ObjectLiteral::BuildConstantProperties(Isolate* isolate) { | 
| is_simple = false; | 
| continue; | 
| } | 
| + | 
| +    if (position == boilerplate_properties_ * 2) { | 
| +      DCHECK(property->is_computed_name()); | 
| +      break; | 
| +    } | 
| +    DCHECK(!property->is_computed_name()); | 
| + | 
| MaterializedLiteral* m_literal = property->value()->AsMaterializedLiteral(); | 
| if (m_literal != NULL) { | 
| m_literal->BuildConstants(isolate); | 
| @@ -288,7 +303,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 | 
| @@ -640,7 +655,8 @@ void CallNew::RecordTypeFeedback(TypeFeedbackOracle* oracle) { | 
|  | 
|  | 
| void ObjectLiteral::Property::RecordTypeFeedback(TypeFeedbackOracle* oracle) { | 
| -  TypeFeedbackId id = key()->LiteralFeedbackId(); | 
| +  DCHECK(!is_computed_name()); | 
| +  TypeFeedbackId id = key()->AsLiteral()->LiteralFeedbackId(); | 
| SmallMapList maps; | 
| oracle->CollectReceiverTypes(id, &maps); | 
| receiver_type_ = maps.length() == 1 ? maps.at(0) | 
|  |