Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(235)

Unified Diff: src/ast.cc

Issue 332443002: Add support for computed property names in object literals (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Dynamic part of object literal initialized with PutOwnProperty Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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)

Powered by Google App Engine
This is Rietveld 408576698