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