| 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)
|
|
|