Chromium Code Reviews| Index: src/ast.cc |
| diff --git a/src/ast.cc b/src/ast.cc |
| index 7fe02be5d8a750411d6d740004cdd0ca36722f8b..dada5204a940d2b1fdaa13778cf2a58a25f28d01 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 { |
|
rossberg
2012/03/08 16:51:39
Nit: indentation.
Sven Panne
2012/03/09 08:24:46
Done.
|
| + str = DoubleToCString(handle_->Number(), buffer); |
| + } |
| + return FACTORY->NewStringFromAscii(CStrVector(str)); |
| +} |
| + |
| + |
| } } // namespace v8::internal |