Index: src/heap-snapshot-generator.cc |
diff --git a/src/heap-snapshot-generator.cc b/src/heap-snapshot-generator.cc |
index cb1fa4d58d2ec18148c15736a42abb853a72dc7b..f5257e67033ca91e747f2e00c9d886bfe235d62b 100644 |
--- a/src/heap-snapshot-generator.cc |
+++ b/src/heap-snapshot-generator.cc |
@@ -1109,22 +1109,13 @@ void V8HeapExplorer::ExtractContextReferences(int entry, Context* context) { |
void V8HeapExplorer::ExtractMapReferences(int entry, Map* map) { |
- SetInternalReference(map, entry, |
- "prototype", map->prototype(), Map::kPrototypeOffset); |
- SetInternalReference(map, entry, |
- "constructor", map->constructor(), |
- Map::kConstructorOffset); |
if (map->HasTransitionArray()) { |
TransitionArray* transitions = map->transitions(); |
- |
+ int transitions_entry = GetEntry(transitions)->index(); |
Object* back_pointer = transitions->back_pointer_storage(); |
- TagObject(transitions->back_pointer_storage(), "(back pointer)"); |
- SetInternalReference(transitions, entry, |
- "backpointer", back_pointer, |
- TransitionArray::kBackPointerStorageOffset); |
- IndexedReferencesExtractor transitions_refs(this, transitions, entry); |
- transitions->Iterate(&transitions_refs); |
- |
+ TagObject(back_pointer, "(back pointer)"); |
+ SetInternalReference(transitions, transitions_entry, |
+ "back_pointer", back_pointer); |
TagObject(transitions, "(transition array)"); |
SetInternalReference(map, entry, |
"transitions", transitions, |
@@ -1133,7 +1124,7 @@ void V8HeapExplorer::ExtractMapReferences(int entry, Map* map) { |
Object* back_pointer = map->GetBackPointer(); |
TagObject(back_pointer, "(back pointer)"); |
SetInternalReference(map, entry, |
- "backpointer", back_pointer, |
+ "back_pointer", back_pointer, |
Map::kTransitionsOrBackPointerOffset); |
} |
DescriptorArray* descriptors = map->instance_descriptors(); |
@@ -1145,6 +1136,11 @@ void V8HeapExplorer::ExtractMapReferences(int entry, Map* map) { |
SetInternalReference(map, entry, |
"code_cache", map->code_cache(), |
Map::kCodeCacheOffset); |
+ SetInternalReference(map, entry, |
+ "prototype", map->prototype(), Map::kPrototypeOffset); |
+ SetInternalReference(map, entry, |
+ "constructor", map->constructor(), |
+ Map::kConstructorOffset); |
} |
@@ -1576,6 +1572,7 @@ void V8HeapExplorer::SetContextReference(HeapObject* parent_obj, |
String* reference_name, |
Object* child_obj, |
int field_offset) { |
+ ASSERT(parent_entry == GetEntry(parent_obj)->index()); |
HeapEntry* child_entry = GetEntry(child_obj); |
if (child_entry != NULL) { |
filler_->SetNamedReference(HeapGraphEdge::kContextVariable, |
@@ -1591,6 +1588,7 @@ void V8HeapExplorer::SetNativeBindReference(HeapObject* parent_obj, |
int parent_entry, |
const char* reference_name, |
Object* child_obj) { |
+ ASSERT(parent_entry == GetEntry(parent_obj)->index()); |
HeapEntry* child_entry = GetEntry(child_obj); |
if (child_entry != NULL) { |
filler_->SetNamedReference(HeapGraphEdge::kShortcut, |
@@ -1605,6 +1603,7 @@ void V8HeapExplorer::SetElementReference(HeapObject* parent_obj, |
int parent_entry, |
int index, |
Object* child_obj) { |
+ ASSERT(parent_entry == GetEntry(parent_obj)->index()); |
HeapEntry* child_entry = GetEntry(child_obj); |
if (child_entry != NULL) { |
filler_->SetIndexedReference(HeapGraphEdge::kElement, |
@@ -1620,6 +1619,7 @@ void V8HeapExplorer::SetInternalReference(HeapObject* parent_obj, |
const char* reference_name, |
Object* child_obj, |
int field_offset) { |
+ ASSERT(parent_entry == GetEntry(parent_obj)->index()); |
HeapEntry* child_entry = GetEntry(child_obj); |
if (child_entry == NULL) return; |
if (IsEssentialObject(child_obj)) { |
@@ -1637,6 +1637,7 @@ void V8HeapExplorer::SetInternalReference(HeapObject* parent_obj, |
int index, |
Object* child_obj, |
int field_offset) { |
+ ASSERT(parent_entry == GetEntry(parent_obj)->index()); |
HeapEntry* child_entry = GetEntry(child_obj); |
if (child_entry == NULL) return; |
if (IsEssentialObject(child_obj)) { |
@@ -1653,6 +1654,7 @@ void V8HeapExplorer::SetHiddenReference(HeapObject* parent_obj, |
int parent_entry, |
int index, |
Object* child_obj) { |
+ ASSERT(parent_entry == GetEntry(parent_obj)->index()); |
HeapEntry* child_entry = GetEntry(child_obj); |
if (child_entry != NULL && IsEssentialObject(child_obj)) { |
filler_->SetIndexedReference(HeapGraphEdge::kHidden, |
@@ -1668,6 +1670,7 @@ void V8HeapExplorer::SetWeakReference(HeapObject* parent_obj, |
int index, |
Object* child_obj, |
int field_offset) { |
+ ASSERT(parent_entry == GetEntry(parent_obj)->index()); |
HeapEntry* child_entry = GetEntry(child_obj); |
if (child_entry != NULL) { |
filler_->SetIndexedReference(HeapGraphEdge::kWeak, |
@@ -1685,6 +1688,7 @@ void V8HeapExplorer::SetPropertyReference(HeapObject* parent_obj, |
Object* child_obj, |
const char* name_format_string, |
int field_offset) { |
+ ASSERT(parent_entry == GetEntry(parent_obj)->index()); |
HeapEntry* child_entry = GetEntry(child_obj); |
if (child_entry != NULL) { |
HeapGraphEdge::Type type = |