Chromium Code Reviews| Index: src/profile-generator.cc |
| diff --git a/src/profile-generator.cc b/src/profile-generator.cc |
| index cf268afc9b41e18f0b763816df783a1f0008798d..edee2886ca2027ab32820b35dc844dedb8c25458 100644 |
| --- a/src/profile-generator.cc |
| +++ b/src/profile-generator.cc |
| @@ -40,6 +40,10 @@ |
| namespace v8 { |
| namespace internal { |
| +bool StringsStorage::StringsMatch(void* key1, void* key2) { |
| + return strcmp(reinterpret_cast<char*>(key1), |
| + reinterpret_cast<char*>(key2)) == 0; |
| +} |
|
alph
2013/10/17 12:19:09
nit: add extra lines around the function.
yurys
2013/10/17 12:56:41
Done.
|
| StringsStorage::StringsStorage(Heap* heap) |
| : hash_seed_(heap->HashSeed()), names_(StringsMatch) { |
| @@ -57,12 +61,15 @@ StringsStorage::~StringsStorage() { |
| const char* StringsStorage::GetCopy(const char* src) { |
| int len = static_cast<int>(strlen(src)); |
| - Vector<char> dst = Vector<char>::New(len + 1); |
| - OS::StrNCpy(dst, src, len); |
| - dst[len] = '\0'; |
| - uint32_t hash = |
| - StringHasher::HashSequentialString(dst.start(), len, hash_seed_); |
| - return AddOrDisposeString(dst.start(), hash); |
| + HashMap::Entry* entry = GetEntry(src, len); |
| + if (entry->value == NULL) { |
| + Vector<char> dst = Vector<char>::New(len + 1); |
| + OS::StrNCpy(dst, src, len); |
| + dst[len] = '\0'; |
| + entry->key = dst.start(); |
| + entry->value = entry->key; |
| + } |
| + return reinterpret_cast<const char*>(entry->value); |
| } |
| @@ -75,15 +82,16 @@ const char* StringsStorage::GetFormatted(const char* format, ...) { |
| } |
| -const char* StringsStorage::AddOrDisposeString(char* str, uint32_t hash) { |
| - HashMap::Entry* cache_entry = names_.Lookup(str, hash, true); |
| - if (cache_entry->value == NULL) { |
| +const char* StringsStorage::AddOrDisposeString(char* str, int len) { |
| + HashMap::Entry* entry = GetEntry(str, len); |
| + if (entry->value == NULL) { |
| // New entry added. |
| - cache_entry->value = str; |
| + entry->key = str; |
| + entry->value = str; |
| } else { |
| DeleteArray(str); |
| } |
| - return reinterpret_cast<const char*>(cache_entry->value); |
| + return reinterpret_cast<const char*>(entry->value); |
| } |
| @@ -92,11 +100,9 @@ const char* StringsStorage::GetVFormatted(const char* format, va_list args) { |
| int len = OS::VSNPrintF(str, format, args); |
| if (len == -1) { |
| DeleteArray(str.start()); |
| - return format; |
| + return GetCopy(format); |
| } |
| - uint32_t hash = StringHasher::HashSequentialString( |
| - str.start(), len, hash_seed_); |
| - return AddOrDisposeString(str.start(), hash); |
| + return AddOrDisposeString(str.start(), len); |
| } |
| @@ -104,11 +110,11 @@ const char* StringsStorage::GetName(Name* name) { |
| if (name->IsString()) { |
| String* str = String::cast(name); |
| int length = Min(kMaxNameSize, str->length()); |
| + int actual_length = 0; |
| SmartArrayPointer<char> data = |
| - str->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL, 0, length); |
| - uint32_t hash = StringHasher::HashSequentialString( |
| - *data, length, name->GetHeap()->HashSeed()); |
| - return AddOrDisposeString(data.Detach(), hash); |
| + str->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL, 0, length, |
| + &actual_length); |
| + return AddOrDisposeString(data.Detach(), actual_length); |
| } else if (name->IsSymbol()) { |
| return "<symbol>"; |
| } |
| @@ -121,6 +127,21 @@ const char* StringsStorage::GetName(int index) { |
| } |
| +const char* StringsStorage::GetFunctionName(Name* name) { |
| + return BeautifyFunctionName(GetName(name)); |
| +} |
| + |
| + |
| +const char* StringsStorage::GetFunctionName(const char* name) { |
| + return BeautifyFunctionName(GetCopy(name)); |
| +} |
| + |
| + |
| +const char* StringsStorage::BeautifyFunctionName(const char* name) { |
| + return (*name == 0) ? ProfileGenerator::kAnonymousFunctionName : name; |
| +} |
| + |
| + |
| size_t StringsStorage::GetUsedMemorySize() const { |
| size_t size = sizeof(*this); |
| size += sizeof(HashMap::Entry) * names_.capacity(); |
| @@ -131,6 +152,12 @@ size_t StringsStorage::GetUsedMemorySize() const { |
| } |
| +HashMap::Entry* StringsStorage::GetEntry(const char* str, int len) { |
| + uint32_t hash = StringHasher::HashSequentialString(str, len, hash_seed_); |
| + return names_.Lookup(const_cast<char*>(str), hash, true); |
| +} |
| + |
| + |
| const char* const CodeEntry::kEmptyNamePrefix = ""; |
| const char* const CodeEntry::kEmptyResourceName = ""; |
| const char* const CodeEntry::kEmptyBailoutReason = ""; |