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