Index: src/profile-generator.cc |
diff --git a/src/profile-generator.cc b/src/profile-generator.cc |
index 8a68f5326be83a66c093de6522806ba996d0bef0..1a2d005a6feb927f490de53361ad8886a3f041d4 100644 |
--- a/src/profile-generator.cc |
+++ b/src/profile-generator.cc |
@@ -1918,6 +1918,7 @@ void V8HeapExplorer::ExtractReferences(HeapObject* obj) { |
SetPropertyReference( |
obj, entry, |
heap_->prototype_symbol(), proto_or_map, |
+ NULL, |
JSFunction::kPrototypeOrInitialMapOffset); |
} else { |
SetPropertyReference( |
@@ -2101,6 +2102,7 @@ void V8HeapExplorer::ExtractPropertyReferences(JSObject* js_obj, |
SetPropertyReference( |
js_obj, entry, |
descs->GetKey(i), js_obj->InObjectPropertyAt(index), |
+ NULL, |
js_obj->GetInObjectPropertyOffset(index)); |
} else { |
SetPropertyReference( |
@@ -2114,6 +2116,21 @@ void V8HeapExplorer::ExtractPropertyReferences(JSObject* js_obj, |
js_obj, entry, |
descs->GetKey(i), descs->GetConstantFunction(i)); |
break; |
+ case CALLBACKS: { |
+ Object* callback_obj = descs->GetValue(i); |
+ if (callback_obj->IsFixedArray()) { |
+ FixedArray* accessors = FixedArray::cast(callback_obj); |
+ if (Object* getter = accessors->get(JSObject::kGetterIndex)) { |
+ SetPropertyReference(js_obj, entry, descs->GetKey(i), |
+ getter, "get-%s"); |
+ } |
+ if (Object* setter = accessors->get(JSObject::kSetterIndex)) { |
+ SetPropertyReference(js_obj, entry, descs->GetKey(i), |
+ setter, "set-%s"); |
+ } |
+ } |
+ break; |
+ } |
case NORMAL: // only in slow mode |
case HANDLER: // only in lookup results, not in descriptors |
case INTERCEPTOR: // only in lookup results, not in descriptors |
@@ -2122,9 +2139,6 @@ void V8HeapExplorer::ExtractPropertyReferences(JSObject* js_obj, |
case CONSTANT_TRANSITION: |
case NULL_DESCRIPTOR: // ... and not about "holes" |
break; |
- // TODO(svenpanne): Should we really ignore accessors here? |
- case CALLBACKS: |
- break; |
} |
} |
} else { |
@@ -2349,15 +2363,23 @@ void V8HeapExplorer::SetPropertyReference(HeapObject* parent_obj, |
HeapEntry* parent_entry, |
String* reference_name, |
Object* child_obj, |
+ const char* name_format_string, |
int field_offset) { |
HeapEntry* child_entry = GetEntry(child_obj); |
if (child_entry != NULL) { |
HeapGraphEdge::Type type = reference_name->length() > 0 ? |
HeapGraphEdge::kProperty : HeapGraphEdge::kInternal; |
+ const char* name = name_format_string != NULL ? |
+ collection_->names()->GetFormatted( |
+ name_format_string, |
+ *reference_name->ToCString(DISALLOW_NULLS, |
+ ROBUST_STRING_TRAVERSAL)) : |
+ collection_->names()->GetName(reference_name); |
+ |
filler_->SetNamedReference(type, |
parent_obj, |
parent_entry, |
- collection_->names()->GetName(reference_name), |
+ name, |
child_obj, |
child_entry); |
IndexedReferencesExtractor::MarkVisitedField(parent_obj, field_offset); |