| Index: src/profile-generator.cc
|
| diff --git a/src/profile-generator.cc b/src/profile-generator.cc
|
| index fe3bc669cb2a00b211fbf557a18f8cd9c7150a8c..977c67c8cc8aaa71bc4597325613c6268bf9b14a 100644
|
| --- a/src/profile-generator.cc
|
| +++ b/src/profile-generator.cc
|
| @@ -94,12 +94,18 @@ StringsStorage::StringsStorage()
|
| }
|
|
|
|
|
| +static void DeleteIndexName(char** name_ptr) {
|
| + DeleteArray(*name_ptr);
|
| +}
|
| +
|
| +
|
| StringsStorage::~StringsStorage() {
|
| for (HashMap::Entry* p = names_.Start();
|
| p != NULL;
|
| p = names_.Next(p)) {
|
| DeleteArray(reinterpret_cast<const char*>(p->value));
|
| }
|
| + index_names_.Iterate(DeleteIndexName);
|
| }
|
|
|
|
|
| @@ -120,6 +126,22 @@ const char* StringsStorage::GetName(String* name) {
|
| }
|
|
|
|
|
| +const char* StringsStorage::GetName(int index) {
|
| + ASSERT(index >= 0);
|
| + if (index_names_.length() <= index) {
|
| + index_names_.AddBlock(
|
| + NULL, index - index_names_.length() + 1);
|
| + }
|
| + if (index_names_[index] == NULL) {
|
| + const int kMaximumNameLength = 32;
|
| + char* name = NewArray<char>(kMaximumNameLength);
|
| + OS::SNPrintF(Vector<char>(name, kMaximumNameLength), "%d", index);
|
| + index_names_[index] = name;
|
| + }
|
| + return index_names_[index];
|
| +}
|
| +
|
| +
|
| const char* CodeEntry::kEmptyNamePrefix = "";
|
|
|
|
|
| @@ -485,11 +507,6 @@ CpuProfilesCollection::CpuProfilesCollection()
|
| }
|
|
|
|
|
| -static void DeleteArgsCountName(char** name_ptr) {
|
| - DeleteArray(*name_ptr);
|
| -}
|
| -
|
| -
|
| static void DeleteCodeEntry(CodeEntry** entry_ptr) {
|
| delete *entry_ptr;
|
| }
|
| @@ -508,7 +525,6 @@ CpuProfilesCollection::~CpuProfilesCollection() {
|
| current_profiles_.Iterate(DeleteCpuProfile);
|
| profiles_by_token_.Iterate(DeleteProfilesList);
|
| code_entries_.Iterate(DeleteCodeEntry);
|
| - args_count_names_.Iterate(DeleteArgsCountName);
|
| }
|
|
|
|
|
| @@ -706,22 +722,6 @@ CodeEntry* CpuProfilesCollection::NewCodeEntry(int security_token_id) {
|
| }
|
|
|
|
|
| -const char* CpuProfilesCollection::GetName(int args_count) {
|
| - ASSERT(args_count >= 0);
|
| - if (args_count_names_.length() <= args_count) {
|
| - args_count_names_.AddBlock(
|
| - NULL, args_count - args_count_names_.length() + 1);
|
| - }
|
| - if (args_count_names_[args_count] == NULL) {
|
| - const int kMaximumNameLength = 32;
|
| - char* name = NewArray<char>(kMaximumNameLength);
|
| - OS::SNPrintF(Vector<char>(name, kMaximumNameLength), "%d", args_count);
|
| - args_count_names_[args_count] = name;
|
| - }
|
| - return args_count_names_[args_count];
|
| -}
|
| -
|
| -
|
| void CpuProfilesCollection::AddPathToCurrentProfiles(
|
| const Vector<CodeEntry*>& path) {
|
| // As starting / stopping profiles is rare relatively to this
|
| @@ -1002,6 +1002,7 @@ const char* HeapEntry::TypeAsString() {
|
| case kCode: return "/code/";
|
| case kArray: return "/array/";
|
| case kRegExp: return "/regexp/";
|
| + case kHeapNumber: return "/number/";
|
| default: return "???";
|
| }
|
| }
|
| @@ -1339,6 +1340,12 @@ HeapEntry* HeapSnapshot::AddEntry(HeapObject* object,
|
| "",
|
| children_count,
|
| retainers_count);
|
| + } else if (object->IsHeapNumber()) {
|
| + return AddEntry(object,
|
| + HeapEntry::kHeapNumber,
|
| + "number",
|
| + children_count,
|
| + retainers_count);
|
| }
|
| // No interest in this object.
|
| return NULL;
|
| @@ -1354,7 +1361,8 @@ bool HeapSnapshot::WillAddEntry(HeapObject* object) {
|
| || object->IsCode()
|
| || object->IsSharedFunctionInfo()
|
| || object->IsScript()
|
| - || object->IsFixedArray();
|
| + || object->IsFixedArray()
|
| + || object->IsHeapNumber();
|
| }
|
|
|
|
|
| @@ -1911,6 +1919,7 @@ void HeapSnapshotGenerator::ExtractReferences(HeapObject* obj) {
|
| ExtractClosureReferences(js_obj, entry);
|
| ExtractPropertyReferences(js_obj, entry);
|
| ExtractElementReferences(js_obj, entry);
|
| + ExtractInternalReferences(js_obj, entry);
|
| SetPropertyReference(
|
| obj, entry, Heap::Proto_symbol(), js_obj->GetPrototype());
|
| if (obj->IsJSFunction()) {
|
| @@ -2019,6 +2028,16 @@ void HeapSnapshotGenerator::ExtractElementReferences(JSObject* js_obj,
|
| }
|
|
|
|
|
| +void HeapSnapshotGenerator::ExtractInternalReferences(JSObject* js_obj,
|
| + HeapEntry* entry) {
|
| + int length = js_obj->GetInternalFieldCount();
|
| + for (int i = 0; i < length; ++i) {
|
| + Object* o = js_obj->GetInternalField(i);
|
| + SetInternalReference(js_obj, entry, i, o);
|
| + }
|
| +}
|
| +
|
| +
|
| void HeapSnapshotGenerator::SetClosureReference(HeapObject* parent_obj,
|
| HeapEntry* parent_entry,
|
| String* reference_name,
|
| @@ -2063,6 +2082,22 @@ void HeapSnapshotGenerator::SetInternalReference(HeapObject* parent_obj,
|
| }
|
|
|
|
|
| +void HeapSnapshotGenerator::SetInternalReference(HeapObject* parent_obj,
|
| + HeapEntry* parent_entry,
|
| + int index,
|
| + Object* child_obj) {
|
| + HeapEntry* child_entry = GetEntry(child_obj);
|
| + if (child_entry != NULL) {
|
| + filler_->SetNamedReference(HeapGraphEdge::kInternal,
|
| + parent_obj,
|
| + parent_entry,
|
| + collection_->GetName(index),
|
| + child_obj,
|
| + child_entry);
|
| + }
|
| +}
|
| +
|
| +
|
| void HeapSnapshotGenerator::SetPropertyReference(HeapObject* parent_obj,
|
| HeapEntry* parent_entry,
|
| String* reference_name,
|
| @@ -2368,7 +2403,8 @@ void HeapSnapshotJSONSerializer::SerializeNodes() {
|
| "," JSON_S("object")
|
| "," JSON_S("code")
|
| "," JSON_S("closure")
|
| - "," JSON_S("regexp"))
|
| + "," JSON_S("regexp")
|
| + "," JSON_S("number"))
|
| "," JSON_S("string")
|
| "," JSON_S("number")
|
| "," JSON_S("number")
|
|
|