| Index: src/ast.cc
|
| diff --git a/src/ast.cc b/src/ast.cc
|
| index 7fe02be5d8a750411d6d740004cdd0ca36722f8b..239e5d0ffe4475a2e885962a9a36832de23a8f54 100644
|
| --- a/src/ast.cc
|
| +++ b/src/ast.cc
|
| @@ -243,55 +243,21 @@ bool IsEqualNumber(void* first, void* second) {
|
|
|
|
|
| void ObjectLiteral::CalculateEmitStore() {
|
| - ZoneHashMap properties(&IsEqualString);
|
| - ZoneHashMap elements(&IsEqualNumber);
|
| - for (int i = this->properties()->length() - 1; i >= 0; i--) {
|
| - ObjectLiteral::Property* property = this->properties()->at(i);
|
| + ZoneHashMap table(Literal::Match);
|
| + for (int i = properties()->length() - 1; i >= 0; i--) {
|
| + ObjectLiteral::Property* property = properties()->at(i);
|
| Literal* literal = property->key();
|
| - Handle<Object> handle = literal->handle();
|
| -
|
| - if (handle->IsNull()) {
|
| - continue;
|
| - }
|
| -
|
| - uint32_t hash;
|
| - ZoneHashMap* table;
|
| - void* key;
|
| - Factory* factory = Isolate::Current()->factory();
|
| - if (handle->IsSymbol()) {
|
| - Handle<String> name(String::cast(*handle));
|
| - if (name->AsArrayIndex(&hash)) {
|
| - Handle<Object> key_handle = factory->NewNumberFromUint(hash);
|
| - key = key_handle.location();
|
| - table = &elements;
|
| - } else {
|
| - key = name.location();
|
| - hash = name->Hash();
|
| - table = &properties;
|
| - }
|
| - } else if (handle->ToArrayIndex(&hash)) {
|
| - key = handle.location();
|
| - table = &elements;
|
| - } else {
|
| - ASSERT(handle->IsNumber());
|
| - double num = handle->Number();
|
| - char arr[100];
|
| - Vector<char> buffer(arr, ARRAY_SIZE(arr));
|
| - const char* str = DoubleToCString(num, buffer);
|
| - Handle<String> name = factory->NewStringFromAscii(CStrVector(str));
|
| - key = name.location();
|
| - hash = name->Hash();
|
| - table = &properties;
|
| - }
|
| + if (literal->handle()->IsNull()) continue;
|
| + uint32_t hash = literal->Hash();
|
| // If the key of a computed property is in the table, do not emit
|
| // a store for the property later.
|
| - if (property->kind() == ObjectLiteral::Property::COMPUTED) {
|
| - if (table->Lookup(key, hash, false) != NULL) {
|
| - property->set_emit_store(false);
|
| - }
|
| + if (property->kind() == ObjectLiteral::Property::COMPUTED &&
|
| + table.Lookup(literal, hash, false) != NULL) {
|
| + property->set_emit_store(false);
|
| + } else {
|
| + // Add key to the table.
|
| + table.Lookup(literal, hash, true);
|
| }
|
| - // Add key to the table.
|
| - table->Lookup(key, hash, true);
|
| }
|
| }
|
|
|
| @@ -1168,4 +1134,22 @@ void AstConstructionVisitor::VisitCallRuntime(CallRuntime* node) {
|
| }
|
| }
|
|
|
| +
|
| +Handle<String> Literal::ToString() {
|
| + if (handle_->IsString()) return Handle<String>::cast(handle_);
|
| + ASSERT(handle_->IsNumber());
|
| + char arr[100];
|
| + Vector<char> buffer(arr, ARRAY_SIZE(arr));
|
| + const char* str;
|
| + if (handle_->IsSmi()) {
|
| + // Optimization only, the heap number case would subsume this.
|
| + OS::SNPrintF(buffer, "%d", Smi::cast(*handle_)->value());
|
| + str = arr;
|
| + } else {
|
| + str = DoubleToCString(handle_->Number(), buffer);
|
| + }
|
| + return FACTORY->NewStringFromAscii(CStrVector(str));
|
| +}
|
| +
|
| +
|
| } } // namespace v8::internal
|
|
|