| Index: src/heap-snapshot-generator.cc
|
| diff --git a/src/heap-snapshot-generator.cc b/src/heap-snapshot-generator.cc
|
| index cb1fa4d58d2ec18148c15736a42abb853a72dc7b..6d2d8912f1a3bd50b9cd6872b84b7a66a7210787 100644
|
| --- a/src/heap-snapshot-generator.cc
|
| +++ b/src/heap-snapshot-generator.cc
|
| @@ -930,7 +930,6 @@ void V8HeapExplorer::ExtractReferences(HeapObject* obj) {
|
| if (heap_entry == NULL) return; // No interest in this object.
|
| int entry = heap_entry->index();
|
|
|
| - bool extract_indexed_refs = true;
|
| if (obj->IsJSGlobalProxy()) {
|
| ExtractJSGlobalProxyReferences(entry, JSGlobalProxy::cast(obj));
|
| } else if (obj->IsJSObject()) {
|
| @@ -953,18 +952,17 @@ void V8HeapExplorer::ExtractReferences(HeapObject* obj) {
|
| ExtractCodeReferences(entry, Code::cast(obj));
|
| } else if (obj->IsCell()) {
|
| ExtractCellReferences(entry, Cell::cast(obj));
|
| - extract_indexed_refs = false;
|
| } else if (obj->IsPropertyCell()) {
|
| ExtractPropertyCellReferences(entry, PropertyCell::cast(obj));
|
| - extract_indexed_refs = false;
|
| } else if (obj->IsAllocationSite()) {
|
| ExtractAllocationSiteReferences(entry, AllocationSite::cast(obj));
|
| }
|
| - if (extract_indexed_refs) {
|
| - SetInternalReference(obj, entry, "map", obj->map(), HeapObject::kMapOffset);
|
| - IndexedReferencesExtractor refs_extractor(this, obj, entry);
|
| - obj->Iterate(&refs_extractor);
|
| - }
|
| + SetInternalReference(obj, entry, "map", obj->map(), HeapObject::kMapOffset);
|
| +
|
| + // Extract unvisited fields as hidden references and restore tags
|
| + // of visited fields.
|
| + IndexedReferencesExtractor refs_extractor(this, obj, entry);
|
| + obj->Iterate(&refs_extractor);
|
| }
|
|
|
|
|
| @@ -1109,22 +1107,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 +1122,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 +1134,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);
|
| }
|
|
|
|
|
| @@ -1254,14 +1248,17 @@ void V8HeapExplorer::ExtractCodeReferences(int entry, Code* code) {
|
|
|
|
|
| void V8HeapExplorer::ExtractCellReferences(int entry, Cell* cell) {
|
| - SetInternalReference(cell, entry, "value", cell->value());
|
| + SetInternalReference(cell, entry, "value", cell->value(), Cell::kValueOffset);
|
| }
|
|
|
|
|
| void V8HeapExplorer::ExtractPropertyCellReferences(int entry,
|
| PropertyCell* cell) {
|
| - SetInternalReference(cell, entry, "value", cell->value());
|
| - SetInternalReference(cell, entry, "type", cell->type());
|
| + ExtractCellReferences(entry, cell);
|
| + SetInternalReference(cell, entry, "type", cell->type(),
|
| + PropertyCell::kTypeOffset);
|
| + SetInternalReference(cell, entry, "dependent_code", cell->dependent_code(),
|
| + PropertyCell::kDependentCodeOffset);
|
| }
|
|
|
|
|
| @@ -1576,6 +1573,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 +1589,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 +1604,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 +1620,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 +1638,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 +1655,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 +1671,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 +1689,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 =
|
|
|