Commit e3f40ad2 authored by Alexei Filippov's avatar Alexei Filippov Committed by Commit Bot

[heap profiler] Refactor: do not pass parent_obj argument when not needed.

Change-Id: I13e3a54f91e8fbaf595bebb65f9a0326bbacd3eb
Reviewed-on: https://chromium-review.googlesource.com/c/1244286
Commit-Queue: Alexei Filippov <alph@chromium.org>
Reviewed-by: 's avatarUlan Degenbaev <ulan@chromium.org>
Reviewed-by: 's avatarMichael Lippautz <mlippautz@chromium.org>
Cr-Commit-Position: refs/heads/master@{#56389}
parent 60b0bea8
...@@ -770,8 +770,7 @@ void V8HeapExplorer::ExtractReferences(HeapEntry* entry, HeapObject* obj) { ...@@ -770,8 +770,7 @@ void V8HeapExplorer::ExtractReferences(HeapEntry* entry, HeapObject* obj) {
void V8HeapExplorer::ExtractJSGlobalProxyReferences(HeapEntry* entry, void V8HeapExplorer::ExtractJSGlobalProxyReferences(HeapEntry* entry,
JSGlobalProxy* proxy) { JSGlobalProxy* proxy) {
SetInternalReference(proxy, entry, SetInternalReference(entry, "native_context", proxy->native_context(),
"native_context", proxy->native_context(),
JSGlobalProxy::kNativeContextOffset); JSGlobalProxy::kNativeContextOffset);
} }
...@@ -783,21 +782,21 @@ void V8HeapExplorer::ExtractJSObjectReferences(HeapEntry* entry, ...@@ -783,21 +782,21 @@ void V8HeapExplorer::ExtractJSObjectReferences(HeapEntry* entry,
ExtractInternalReferences(js_obj, entry); ExtractInternalReferences(js_obj, entry);
PrototypeIterator iter(heap_->isolate(), js_obj); PrototypeIterator iter(heap_->isolate(), js_obj);
ReadOnlyRoots roots(heap_); ReadOnlyRoots roots(heap_);
SetPropertyReference(obj, entry, roots.proto_string(), iter.GetCurrent()); SetPropertyReference(entry, roots.proto_string(), iter.GetCurrent());
if (obj->IsJSBoundFunction()) { if (obj->IsJSBoundFunction()) {
JSBoundFunction* js_fun = JSBoundFunction::cast(obj); JSBoundFunction* js_fun = JSBoundFunction::cast(obj);
TagObject(js_fun->bound_arguments(), "(bound arguments)"); TagObject(js_fun->bound_arguments(), "(bound arguments)");
SetInternalReference(js_fun, entry, "bindings", js_fun->bound_arguments(), SetInternalReference(entry, "bindings", js_fun->bound_arguments(),
JSBoundFunction::kBoundArgumentsOffset); JSBoundFunction::kBoundArgumentsOffset);
SetInternalReference(js_obj, entry, "bound_this", js_fun->bound_this(), SetInternalReference(entry, "bound_this", js_fun->bound_this(),
JSBoundFunction::kBoundThisOffset); JSBoundFunction::kBoundThisOffset);
SetInternalReference(js_obj, entry, "bound_function", SetInternalReference(entry, "bound_function",
js_fun->bound_target_function(), js_fun->bound_target_function(),
JSBoundFunction::kBoundTargetFunctionOffset); JSBoundFunction::kBoundTargetFunctionOffset);
FixedArray* bindings = js_fun->bound_arguments(); FixedArray* bindings = js_fun->bound_arguments();
for (int i = 0; i < bindings->length(); i++) { for (int i = 0; i < bindings->length(); i++) {
const char* reference_name = names_->GetFormatted("bound_argument_%d", i); const char* reference_name = names_->GetFormatted("bound_argument_%d", i);
SetNativeBindReference(js_obj, entry, reference_name, bindings->get(i)); SetNativeBindReference(entry, reference_name, bindings->get(i));
} }
} else if (obj->IsJSFunction()) { } else if (obj->IsJSFunction()) {
JSFunction* js_fun = JSFunction::cast(js_obj); JSFunction* js_fun = JSFunction::cast(js_obj);
...@@ -805,93 +804,83 @@ void V8HeapExplorer::ExtractJSObjectReferences(HeapEntry* entry, ...@@ -805,93 +804,83 @@ void V8HeapExplorer::ExtractJSObjectReferences(HeapEntry* entry,
Object* proto_or_map = js_fun->prototype_or_initial_map(); Object* proto_or_map = js_fun->prototype_or_initial_map();
if (!proto_or_map->IsTheHole(heap_->isolate())) { if (!proto_or_map->IsTheHole(heap_->isolate())) {
if (!proto_or_map->IsMap()) { if (!proto_or_map->IsMap()) {
SetPropertyReference(obj, entry, roots.prototype_string(), SetPropertyReference(entry, roots.prototype_string(), proto_or_map,
proto_or_map, nullptr, nullptr,
JSFunction::kPrototypeOrInitialMapOffset); JSFunction::kPrototypeOrInitialMapOffset);
} else { } else {
SetPropertyReference(obj, entry, roots.prototype_string(), SetPropertyReference(entry, roots.prototype_string(),
js_fun->prototype()); js_fun->prototype());
SetInternalReference(obj, entry, "initial_map", proto_or_map, SetInternalReference(entry, "initial_map", proto_or_map,
JSFunction::kPrototypeOrInitialMapOffset); JSFunction::kPrototypeOrInitialMapOffset);
} }
} }
} }
SharedFunctionInfo* shared_info = js_fun->shared(); SharedFunctionInfo* shared_info = js_fun->shared();
TagObject(js_fun->feedback_cell(), "(function feedback cell)"); TagObject(js_fun->feedback_cell(), "(function feedback cell)");
SetInternalReference(js_fun, entry, "feedback_cell", SetInternalReference(entry, "feedback_cell", js_fun->feedback_cell(),
js_fun->feedback_cell(),
JSFunction::kFeedbackCellOffset); JSFunction::kFeedbackCellOffset);
TagObject(shared_info, "(shared function info)"); TagObject(shared_info, "(shared function info)");
SetInternalReference(js_fun, entry, SetInternalReference(entry, "shared", shared_info,
"shared", shared_info,
JSFunction::kSharedFunctionInfoOffset); JSFunction::kSharedFunctionInfoOffset);
TagObject(js_fun->context(), "(context)"); TagObject(js_fun->context(), "(context)");
SetInternalReference(js_fun, entry, SetInternalReference(entry, "context", js_fun->context(),
"context", js_fun->context(),
JSFunction::kContextOffset); JSFunction::kContextOffset);
TagCodeObject(js_fun->code()); TagCodeObject(js_fun->code());
SetInternalReference(js_fun, entry, "code", js_fun->code(), SetInternalReference(entry, "code", js_fun->code(),
JSFunction::kCodeOffset); JSFunction::kCodeOffset);
} else if (obj->IsJSGlobalObject()) { } else if (obj->IsJSGlobalObject()) {
JSGlobalObject* global_obj = JSGlobalObject::cast(obj); JSGlobalObject* global_obj = JSGlobalObject::cast(obj);
SetInternalReference(global_obj, entry, "native_context", SetInternalReference(entry, "native_context", global_obj->native_context(),
global_obj->native_context(),
JSGlobalObject::kNativeContextOffset); JSGlobalObject::kNativeContextOffset);
SetInternalReference(global_obj, entry, "global_proxy", SetInternalReference(entry, "global_proxy", global_obj->global_proxy(),
global_obj->global_proxy(),
JSGlobalObject::kGlobalProxyOffset); JSGlobalObject::kGlobalProxyOffset);
STATIC_ASSERT(JSGlobalObject::kSize - JSObject::kHeaderSize == STATIC_ASSERT(JSGlobalObject::kSize - JSObject::kHeaderSize ==
2 * kPointerSize); 2 * kPointerSize);
} else if (obj->IsJSArrayBufferView()) { } else if (obj->IsJSArrayBufferView()) {
JSArrayBufferView* view = JSArrayBufferView::cast(obj); JSArrayBufferView* view = JSArrayBufferView::cast(obj);
SetInternalReference(view, entry, "buffer", view->buffer(), SetInternalReference(entry, "buffer", view->buffer(),
JSArrayBufferView::kBufferOffset); JSArrayBufferView::kBufferOffset);
} }
TagObject(js_obj->raw_properties_or_hash(), "(object properties)"); TagObject(js_obj->raw_properties_or_hash(), "(object properties)");
SetInternalReference(obj, entry, "properties", SetInternalReference(entry, "properties", js_obj->raw_properties_or_hash(),
js_obj->raw_properties_or_hash(),
JSObject::kPropertiesOrHashOffset); JSObject::kPropertiesOrHashOffset);
TagObject(js_obj->elements(), "(object elements)"); TagObject(js_obj->elements(), "(object elements)");
SetInternalReference(obj, entry, SetInternalReference(entry, "elements", js_obj->elements(),
"elements", js_obj->elements(),
JSObject::kElementsOffset); JSObject::kElementsOffset);
} }
void V8HeapExplorer::ExtractStringReferences(HeapEntry* entry, String* string) { void V8HeapExplorer::ExtractStringReferences(HeapEntry* entry, String* string) {
if (string->IsConsString()) { if (string->IsConsString()) {
ConsString* cs = ConsString::cast(string); ConsString* cs = ConsString::cast(string);
SetInternalReference(cs, entry, "first", cs->first(), SetInternalReference(entry, "first", cs->first(), ConsString::kFirstOffset);
ConsString::kFirstOffset); SetInternalReference(entry, "second", cs->second(),
SetInternalReference(cs, entry, "second", cs->second(),
ConsString::kSecondOffset); ConsString::kSecondOffset);
} else if (string->IsSlicedString()) { } else if (string->IsSlicedString()) {
SlicedString* ss = SlicedString::cast(string); SlicedString* ss = SlicedString::cast(string);
SetInternalReference(ss, entry, "parent", ss->parent(), SetInternalReference(entry, "parent", ss->parent(),
SlicedString::kParentOffset); SlicedString::kParentOffset);
} else if (string->IsThinString()) { } else if (string->IsThinString()) {
ThinString* ts = ThinString::cast(string); ThinString* ts = ThinString::cast(string);
SetInternalReference(ts, entry, "actual", ts->actual(), SetInternalReference(entry, "actual", ts->actual(),
ThinString::kActualOffset); ThinString::kActualOffset);
} }
} }
void V8HeapExplorer::ExtractSymbolReferences(HeapEntry* entry, Symbol* symbol) { void V8HeapExplorer::ExtractSymbolReferences(HeapEntry* entry, Symbol* symbol) {
SetInternalReference(symbol, entry, SetInternalReference(entry, "name", symbol->name(), Symbol::kNameOffset);
"name", symbol->name(),
Symbol::kNameOffset);
} }
void V8HeapExplorer::ExtractJSCollectionReferences(HeapEntry* entry, void V8HeapExplorer::ExtractJSCollectionReferences(HeapEntry* entry,
JSCollection* collection) { JSCollection* collection) {
SetInternalReference(collection, entry, "table", collection->table(), SetInternalReference(entry, "table", collection->table(),
JSCollection::kTableOffset); JSCollection::kTableOffset);
} }
void V8HeapExplorer::ExtractJSWeakCollectionReferences(HeapEntry* entry, void V8HeapExplorer::ExtractJSWeakCollectionReferences(HeapEntry* entry,
JSWeakCollection* obj) { JSWeakCollection* obj) {
SetInternalReference(obj, entry, "table", obj->table(), SetInternalReference(entry, "table", obj->table(),
JSWeakCollection::kTableOffset); JSWeakCollection::kTableOffset);
} }
...@@ -903,9 +892,9 @@ void V8HeapExplorer::ExtractEphemeronHashTableReferences( ...@@ -903,9 +892,9 @@ void V8HeapExplorer::ExtractEphemeronHashTableReferences(
int value_index = EphemeronHashTable::EntryToValueIndex(i); int value_index = EphemeronHashTable::EntryToValueIndex(i);
Object* key = table->get(key_index); Object* key = table->get(key_index);
Object* value = table->get(value_index); Object* value = table->get(value_index);
SetWeakReference(table, entry, key_index, key, SetWeakReference(entry, key_index, key,
table->OffsetOfElementAt(key_index)); table->OffsetOfElementAt(key_index));
SetWeakReference(table, entry, value_index, value, SetWeakReference(entry, value_index, value,
table->OffsetOfElementAt(value_index)); table->OffsetOfElementAt(value_index));
HeapEntry* key_entry = GetEntry(key); HeapEntry* key_entry = GetEntry(key);
HeapEntry* value_entry = GetEntry(value); HeapEntry* value_entry = GetEntry(value);
...@@ -939,31 +928,29 @@ void V8HeapExplorer::ExtractContextReferences(HeapEntry* entry, ...@@ -939,31 +928,29 @@ void V8HeapExplorer::ExtractContextReferences(HeapEntry* entry,
for (int i = 0; i < context_locals; ++i) { for (int i = 0; i < context_locals; ++i) {
String* local_name = scope_info->ContextLocalName(i); String* local_name = scope_info->ContextLocalName(i);
int idx = Context::MIN_CONTEXT_SLOTS + i; int idx = Context::MIN_CONTEXT_SLOTS + i;
SetContextReference(context, entry, local_name, context->get(idx), SetContextReference(entry, local_name, context->get(idx),
Context::OffsetOfElementAt(idx)); Context::OffsetOfElementAt(idx));
} }
if (scope_info->HasFunctionName()) { if (scope_info->HasFunctionName()) {
String* name = String::cast(scope_info->FunctionName()); String* name = String::cast(scope_info->FunctionName());
int idx = scope_info->FunctionContextSlotIndex(name); int idx = scope_info->FunctionContextSlotIndex(name);
if (idx >= 0) { if (idx >= 0) {
SetContextReference(context, entry, name, context->get(idx), SetContextReference(entry, name, context->get(idx),
Context::OffsetOfElementAt(idx)); Context::OffsetOfElementAt(idx));
} }
} }
} }
SetInternalReference( SetInternalReference(
context, entry, "scope_info", context->get(Context::SCOPE_INFO_INDEX), entry, "scope_info", context->get(Context::SCOPE_INFO_INDEX),
FixedArray::OffsetOfElementAt(Context::SCOPE_INFO_INDEX)); FixedArray::OffsetOfElementAt(Context::SCOPE_INFO_INDEX));
SetInternalReference(context, entry, "previous", SetInternalReference(entry, "previous", context->get(Context::PREVIOUS_INDEX),
context->get(Context::PREVIOUS_INDEX),
FixedArray::OffsetOfElementAt(Context::PREVIOUS_INDEX)); FixedArray::OffsetOfElementAt(Context::PREVIOUS_INDEX));
SetInternalReference(context, entry, "extension", SetInternalReference(entry, "extension",
context->get(Context::EXTENSION_INDEX), context->get(Context::EXTENSION_INDEX),
FixedArray::OffsetOfElementAt(Context::EXTENSION_INDEX)); FixedArray::OffsetOfElementAt(Context::EXTENSION_INDEX));
SetInternalReference( SetInternalReference(
context, entry, "native_context", entry, "native_context", context->get(Context::NATIVE_CONTEXT_INDEX),
context->get(Context::NATIVE_CONTEXT_INDEX),
FixedArray::OffsetOfElementAt(Context::NATIVE_CONTEXT_INDEX)); FixedArray::OffsetOfElementAt(Context::NATIVE_CONTEXT_INDEX));
if (context->IsNativeContext()) { if (context->IsNativeContext()) {
...@@ -972,16 +959,16 @@ void V8HeapExplorer::ExtractContextReferences(HeapEntry* entry, ...@@ -972,16 +959,16 @@ void V8HeapExplorer::ExtractContextReferences(HeapEntry* entry,
for (size_t i = 0; i < arraysize(native_context_names); i++) { for (size_t i = 0; i < arraysize(native_context_names); i++) {
int index = native_context_names[i].index; int index = native_context_names[i].index;
const char* name = native_context_names[i].name; const char* name = native_context_names[i].name;
SetInternalReference(context, entry, name, context->get(index), SetInternalReference(entry, name, context->get(index),
FixedArray::OffsetOfElementAt(index)); FixedArray::OffsetOfElementAt(index));
} }
SetWeakReference( SetWeakReference(
context, entry, "optimized_code_list", entry, "optimized_code_list",
context->get(Context::OPTIMIZED_CODE_LIST), context->get(Context::OPTIMIZED_CODE_LIST),
FixedArray::OffsetOfElementAt(Context::OPTIMIZED_CODE_LIST)); FixedArray::OffsetOfElementAt(Context::OPTIMIZED_CODE_LIST));
SetWeakReference( SetWeakReference(
context, entry, "deoptimized_code_list", entry, "deoptimized_code_list",
context->get(Context::DEOPTIMIZED_CODE_LIST), context->get(Context::DEOPTIMIZED_CODE_LIST),
FixedArray::OffsetOfElementAt(Context::DEOPTIMIZED_CODE_LIST)); FixedArray::OffsetOfElementAt(Context::DEOPTIMIZED_CODE_LIST));
STATIC_ASSERT(Context::OPTIMIZED_CODE_LIST == Context::FIRST_WEAK_SLOT); STATIC_ASSERT(Context::OPTIMIZED_CODE_LIST == Context::FIRST_WEAK_SLOT);
...@@ -998,8 +985,7 @@ void V8HeapExplorer::ExtractMapReferences(HeapEntry* entry, Map* map) { ...@@ -998,8 +985,7 @@ void V8HeapExplorer::ExtractMapReferences(HeapEntry* entry, Map* map) {
if (maybe_raw_transitions_or_prototype_info->GetHeapObjectIfWeak( if (maybe_raw_transitions_or_prototype_info->GetHeapObjectIfWeak(
&raw_transitions_or_prototype_info)) { &raw_transitions_or_prototype_info)) {
DCHECK(raw_transitions_or_prototype_info->IsMap()); DCHECK(raw_transitions_or_prototype_info->IsMap());
SetWeakReference(map, entry, "transition", SetWeakReference(entry, "transition", raw_transitions_or_prototype_info,
raw_transitions_or_prototype_info,
Map::kTransitionsOrPrototypeInfoOffset); Map::kTransitionsOrPrototypeInfoOffset);
} else if (maybe_raw_transitions_or_prototype_info->GetHeapObjectIfStrong( } else if (maybe_raw_transitions_or_prototype_info->GetHeapObjectIfStrong(
&raw_transitions_or_prototype_info)) { &raw_transitions_or_prototype_info)) {
...@@ -1011,54 +997,52 @@ void V8HeapExplorer::ExtractMapReferences(HeapEntry* entry, Map* map) { ...@@ -1011,54 +997,52 @@ void V8HeapExplorer::ExtractMapReferences(HeapEntry* entry, Map* map) {
"(prototype transitions)"); "(prototype transitions)");
} }
TagObject(transitions, "(transition array)"); TagObject(transitions, "(transition array)");
SetInternalReference(map, entry, "transitions", transitions, SetInternalReference(entry, "transitions", transitions,
Map::kTransitionsOrPrototypeInfoOffset); Map::kTransitionsOrPrototypeInfoOffset);
} else if (raw_transitions_or_prototype_info->IsTuple3() || } else if (raw_transitions_or_prototype_info->IsTuple3() ||
raw_transitions_or_prototype_info->IsFixedArray()) { raw_transitions_or_prototype_info->IsFixedArray()) {
TagObject(raw_transitions_or_prototype_info, "(transition)"); TagObject(raw_transitions_or_prototype_info, "(transition)");
SetInternalReference(map, entry, "transition", SetInternalReference(entry, "transition",
raw_transitions_or_prototype_info, raw_transitions_or_prototype_info,
Map::kTransitionsOrPrototypeInfoOffset); Map::kTransitionsOrPrototypeInfoOffset);
} else if (map->is_prototype_map()) { } else if (map->is_prototype_map()) {
TagObject(raw_transitions_or_prototype_info, "prototype_info"); TagObject(raw_transitions_or_prototype_info, "prototype_info");
SetInternalReference(map, entry, "prototype_info", SetInternalReference(entry, "prototype_info",
raw_transitions_or_prototype_info, raw_transitions_or_prototype_info,
Map::kTransitionsOrPrototypeInfoOffset); Map::kTransitionsOrPrototypeInfoOffset);
} }
} }
DescriptorArray* descriptors = map->instance_descriptors(); DescriptorArray* descriptors = map->instance_descriptors();
TagObject(descriptors, "(map descriptors)"); TagObject(descriptors, "(map descriptors)");
SetInternalReference(map, entry, "descriptors", descriptors, SetInternalReference(entry, "descriptors", descriptors,
Map::kDescriptorsOffset); Map::kDescriptorsOffset);
SetInternalReference(map, entry, "prototype", map->prototype(), SetInternalReference(entry, "prototype", map->prototype(),
Map::kPrototypeOffset); Map::kPrototypeOffset);
if (FLAG_unbox_double_fields) { if (FLAG_unbox_double_fields) {
SetInternalReference(map, entry, "layout_descriptor", SetInternalReference(entry, "layout_descriptor", map->layout_descriptor(),
map->layout_descriptor(),
Map::kLayoutDescriptorOffset); Map::kLayoutDescriptorOffset);
} }
Object* constructor_or_backpointer = map->constructor_or_backpointer(); Object* constructor_or_backpointer = map->constructor_or_backpointer();
if (constructor_or_backpointer->IsMap()) { if (constructor_or_backpointer->IsMap()) {
TagObject(constructor_or_backpointer, "(back pointer)"); TagObject(constructor_or_backpointer, "(back pointer)");
SetInternalReference(map, entry, "back_pointer", constructor_or_backpointer, SetInternalReference(entry, "back_pointer", constructor_or_backpointer,
Map::kConstructorOrBackPointerOffset); Map::kConstructorOrBackPointerOffset);
} else if (constructor_or_backpointer->IsFunctionTemplateInfo()) { } else if (constructor_or_backpointer->IsFunctionTemplateInfo()) {
TagObject(constructor_or_backpointer, "(constructor function data)"); TagObject(constructor_or_backpointer, "(constructor function data)");
SetInternalReference(map, entry, "constructor_function_data", SetInternalReference(entry, "constructor_function_data",
constructor_or_backpointer, constructor_or_backpointer,
Map::kConstructorOrBackPointerOffset); Map::kConstructorOrBackPointerOffset);
} else { } else {
SetInternalReference(map, entry, "constructor", constructor_or_backpointer, SetInternalReference(entry, "constructor", constructor_or_backpointer,
Map::kConstructorOrBackPointerOffset); Map::kConstructorOrBackPointerOffset);
} }
TagObject(map->dependent_code(), "(dependent code)"); TagObject(map->dependent_code(), "(dependent code)");
SetInternalReference(map, entry, "dependent_code", map->dependent_code(), SetInternalReference(entry, "dependent_code", map->dependent_code(),
Map::kDependentCodeOffset); Map::kDependentCodeOffset);
} }
void V8HeapExplorer::ExtractSharedFunctionInfoReferences( void V8HeapExplorer::ExtractSharedFunctionInfoReferences(
HeapEntry* entry, SharedFunctionInfo* shared) { HeapEntry* entry, SharedFunctionInfo* shared) {
HeapObject* obj = shared;
String* shared_name = shared->DebugName(); String* shared_name = shared->DebugName();
const char* name = nullptr; const char* name = nullptr;
if (shared_name != ReadOnlyRoots(heap_).empty_string()) { if (shared_name != ReadOnlyRoots(heap_).empty_string()) {
...@@ -1073,58 +1057,51 @@ void V8HeapExplorer::ExtractSharedFunctionInfoReferences( ...@@ -1073,58 +1057,51 @@ void V8HeapExplorer::ExtractSharedFunctionInfoReferences(
if (shared->name_or_scope_info()->IsScopeInfo()) { if (shared->name_or_scope_info()->IsScopeInfo()) {
TagObject(shared->name_or_scope_info(), "(function scope info)"); TagObject(shared->name_or_scope_info(), "(function scope info)");
} }
SetInternalReference(obj, entry, "name_or_scope_info", SetInternalReference(entry, "name_or_scope_info",
shared->name_or_scope_info(), shared->name_or_scope_info(),
SharedFunctionInfo::kNameOrScopeInfoOffset); SharedFunctionInfo::kNameOrScopeInfoOffset);
SetInternalReference(obj, entry, "script_or_debug_info", SetInternalReference(entry, "script_or_debug_info",
shared->script_or_debug_info(), shared->script_or_debug_info(),
SharedFunctionInfo::kScriptOrDebugInfoOffset); SharedFunctionInfo::kScriptOrDebugInfoOffset);
SetInternalReference(obj, entry, SetInternalReference(entry, "function_data", shared->function_data(),
"function_data", shared->function_data(),
SharedFunctionInfo::kFunctionDataOffset); SharedFunctionInfo::kFunctionDataOffset);
SetInternalReference( SetInternalReference(
obj, entry, "raw_outer_scope_info_or_feedback_metadata", entry, "raw_outer_scope_info_or_feedback_metadata",
shared->raw_outer_scope_info_or_feedback_metadata(), shared->raw_outer_scope_info_or_feedback_metadata(),
SharedFunctionInfo::kOuterScopeInfoOrFeedbackMetadataOffset); SharedFunctionInfo::kOuterScopeInfoOrFeedbackMetadataOffset);
} }
void V8HeapExplorer::ExtractScriptReferences(HeapEntry* entry, Script* script) { void V8HeapExplorer::ExtractScriptReferences(HeapEntry* entry, Script* script) {
HeapObject* obj = script; SetInternalReference(entry, "source", script->source(),
SetInternalReference(obj, entry,
"source", script->source(),
Script::kSourceOffset); Script::kSourceOffset);
SetInternalReference(obj, entry, SetInternalReference(entry, "name", script->name(), Script::kNameOffset);
"name", script->name(), SetInternalReference(entry, "context_data", script->context_data(),
Script::kNameOffset);
SetInternalReference(obj, entry,
"context_data", script->context_data(),
Script::kContextOffset); Script::kContextOffset);
TagObject(script->line_ends(), "(script line ends)"); TagObject(script->line_ends(), "(script line ends)");
SetInternalReference(obj, entry, SetInternalReference(entry, "line_ends", script->line_ends(),
"line_ends", script->line_ends(),
Script::kLineEndsOffset); Script::kLineEndsOffset);
} }
void V8HeapExplorer::ExtractAccessorInfoReferences( void V8HeapExplorer::ExtractAccessorInfoReferences(
HeapEntry* entry, AccessorInfo* accessor_info) { HeapEntry* entry, AccessorInfo* accessor_info) {
SetInternalReference(accessor_info, entry, "name", accessor_info->name(), SetInternalReference(entry, "name", accessor_info->name(),
AccessorInfo::kNameOffset); AccessorInfo::kNameOffset);
SetInternalReference(accessor_info, entry, "expected_receiver_type", SetInternalReference(entry, "expected_receiver_type",
accessor_info->expected_receiver_type(), accessor_info->expected_receiver_type(),
AccessorInfo::kExpectedReceiverTypeOffset); AccessorInfo::kExpectedReceiverTypeOffset);
SetInternalReference(accessor_info, entry, "getter", accessor_info->getter(), SetInternalReference(entry, "getter", accessor_info->getter(),
AccessorInfo::kGetterOffset); AccessorInfo::kGetterOffset);
SetInternalReference(accessor_info, entry, "setter", accessor_info->setter(), SetInternalReference(entry, "setter", accessor_info->setter(),
AccessorInfo::kSetterOffset); AccessorInfo::kSetterOffset);
SetInternalReference(accessor_info, entry, "data", accessor_info->data(), SetInternalReference(entry, "data", accessor_info->data(),
AccessorInfo::kDataOffset); AccessorInfo::kDataOffset);
} }
void V8HeapExplorer::ExtractAccessorPairReferences(HeapEntry* entry, void V8HeapExplorer::ExtractAccessorPairReferences(HeapEntry* entry,
AccessorPair* accessors) { AccessorPair* accessors) {
SetInternalReference(accessors, entry, "getter", accessors->getter(), SetInternalReference(entry, "getter", accessors->getter(),
AccessorPair::kGetterOffset); AccessorPair::kGetterOffset);
SetInternalReference(accessors, entry, "setter", accessors->setter(), SetInternalReference(entry, "setter", accessors->setter(),
AccessorPair::kSetterOffset); AccessorPair::kSetterOffset);
} }
...@@ -1143,55 +1120,53 @@ void V8HeapExplorer::TagCodeObject(Code* code) { ...@@ -1143,55 +1120,53 @@ void V8HeapExplorer::TagCodeObject(Code* code) {
void V8HeapExplorer::ExtractCodeReferences(HeapEntry* entry, Code* code) { void V8HeapExplorer::ExtractCodeReferences(HeapEntry* entry, Code* code) {
TagCodeObject(code); TagCodeObject(code);
TagObject(code->relocation_info(), "(code relocation info)"); TagObject(code->relocation_info(), "(code relocation info)");
SetInternalReference(code, entry, SetInternalReference(entry, "relocation_info", code->relocation_info(),
"relocation_info", code->relocation_info(),
Code::kRelocationInfoOffset); Code::kRelocationInfoOffset);
TagObject(code->deoptimization_data(), "(code deopt data)"); TagObject(code->deoptimization_data(), "(code deopt data)");
SetInternalReference(code, entry, SetInternalReference(entry, "deoptimization_data",
"deoptimization_data", code->deoptimization_data(), code->deoptimization_data(),
Code::kDeoptimizationDataOffset); Code::kDeoptimizationDataOffset);
TagObject(code->source_position_table(), "(source position table)"); TagObject(code->source_position_table(), "(source position table)");
SetInternalReference(code, entry, "source_position_table", SetInternalReference(entry, "source_position_table",
code->source_position_table(), code->source_position_table(),
Code::kSourcePositionTableOffset); Code::kSourcePositionTableOffset);
} }
void V8HeapExplorer::ExtractCellReferences(HeapEntry* entry, Cell* cell) { void V8HeapExplorer::ExtractCellReferences(HeapEntry* entry, Cell* cell) {
SetInternalReference(cell, entry, "value", cell->value(), Cell::kValueOffset); SetInternalReference(entry, "value", cell->value(), Cell::kValueOffset);
} }
void V8HeapExplorer::ExtractFeedbackCellReferences( void V8HeapExplorer::ExtractFeedbackCellReferences(
HeapEntry* entry, FeedbackCell* feedback_cell) { HeapEntry* entry, FeedbackCell* feedback_cell) {
TagObject(feedback_cell, "(feedback cell)"); TagObject(feedback_cell, "(feedback cell)");
SetInternalReference(feedback_cell, entry, "value", feedback_cell->value(), SetInternalReference(entry, "value", feedback_cell->value(),
FeedbackCell::kValueOffset); FeedbackCell::kValueOffset);
} }
void V8HeapExplorer::ExtractPropertyCellReferences(HeapEntry* entry, void V8HeapExplorer::ExtractPropertyCellReferences(HeapEntry* entry,
PropertyCell* cell) { PropertyCell* cell) {
SetInternalReference(cell, entry, "value", cell->value(), SetInternalReference(entry, "value", cell->value(),
PropertyCell::kValueOffset); PropertyCell::kValueOffset);
TagObject(cell->dependent_code(), "(dependent code)"); TagObject(cell->dependent_code(), "(dependent code)");
SetInternalReference(cell, entry, "dependent_code", cell->dependent_code(), SetInternalReference(entry, "dependent_code", cell->dependent_code(),
PropertyCell::kDependentCodeOffset); PropertyCell::kDependentCodeOffset);
} }
void V8HeapExplorer::ExtractAllocationSiteReferences(HeapEntry* entry, void V8HeapExplorer::ExtractAllocationSiteReferences(HeapEntry* entry,
AllocationSite* site) { AllocationSite* site) {
SetInternalReference(site, entry, "transition_info", SetInternalReference(entry, "transition_info",
site->transition_info_or_boilerplate(), site->transition_info_or_boilerplate(),
AllocationSite::kTransitionInfoOrBoilerplateOffset); AllocationSite::kTransitionInfoOrBoilerplateOffset);
SetInternalReference(site, entry, "nested_site", site->nested_site(), SetInternalReference(entry, "nested_site", site->nested_site(),
AllocationSite::kNestedSiteOffset); AllocationSite::kNestedSiteOffset);
TagObject(site->dependent_code(), "(dependent code)"); TagObject(site->dependent_code(), "(dependent code)");
SetInternalReference(site, entry, "dependent_code", site->dependent_code(), SetInternalReference(entry, "dependent_code", site->dependent_code(),
AllocationSite::kDependentCodeOffset); AllocationSite::kDependentCodeOffset);
} }
void V8HeapExplorer::ExtractArrayBoilerplateDescriptionReferences( void V8HeapExplorer::ExtractArrayBoilerplateDescriptionReferences(
HeapEntry* entry, ArrayBoilerplateDescription* value) { HeapEntry* entry, ArrayBoilerplateDescription* value) {
SetInternalReference(value, entry, "constant_elements", SetInternalReference(entry, "constant_elements", value->constant_elements(),
value->constant_elements(),
ArrayBoilerplateDescription::kConstantElementsOffset); ArrayBoilerplateDescription::kConstantElementsOffset);
} }
...@@ -1226,20 +1201,20 @@ void V8HeapExplorer::ExtractJSArrayBufferReferences(HeapEntry* entry, ...@@ -1226,20 +1201,20 @@ void V8HeapExplorer::ExtractJSArrayBufferReferences(HeapEntry* entry,
void V8HeapExplorer::ExtractJSPromiseReferences(HeapEntry* entry, void V8HeapExplorer::ExtractJSPromiseReferences(HeapEntry* entry,
JSPromise* promise) { JSPromise* promise) {
SetInternalReference(promise, entry, "reactions_or_result", SetInternalReference(entry, "reactions_or_result",
promise->reactions_or_result(), promise->reactions_or_result(),
JSPromise::kReactionsOrResultOffset); JSPromise::kReactionsOrResultOffset);
} }
void V8HeapExplorer::ExtractJSGeneratorObjectReferences( void V8HeapExplorer::ExtractJSGeneratorObjectReferences(
HeapEntry* entry, JSGeneratorObject* generator) { HeapEntry* entry, JSGeneratorObject* generator) {
SetInternalReference(generator, entry, "function", generator->function(), SetInternalReference(entry, "function", generator->function(),
JSGeneratorObject::kFunctionOffset); JSGeneratorObject::kFunctionOffset);
SetInternalReference(generator, entry, "context", generator->context(), SetInternalReference(entry, "context", generator->context(),
JSGeneratorObject::kContextOffset); JSGeneratorObject::kContextOffset);
SetInternalReference(generator, entry, "receiver", generator->receiver(), SetInternalReference(entry, "receiver", generator->receiver(),
JSGeneratorObject::kReceiverOffset); JSGeneratorObject::kReceiverOffset);
SetInternalReference(generator, entry, "parameters_and_registers", SetInternalReference(entry, "parameters_and_registers",
generator->parameters_and_registers(), generator->parameters_and_registers(),
JSGeneratorObject::kParametersAndRegistersOffset); JSGeneratorObject::kParametersAndRegistersOffset);
} }
...@@ -1248,8 +1223,7 @@ void V8HeapExplorer::ExtractFixedArrayReferences(HeapEntry* entry, ...@@ -1248,8 +1223,7 @@ void V8HeapExplorer::ExtractFixedArrayReferences(HeapEntry* entry,
FixedArray* array) { FixedArray* array) {
for (int i = 0, l = array->length(); i < l; ++i) { for (int i = 0, l = array->length(); i < l; ++i) {
DCHECK(!HasWeakHeapObjectTag(array->get(i))); DCHECK(!HasWeakHeapObjectTag(array->get(i)));
SetInternalReference(array, entry, i, array->get(i), SetInternalReference(entry, i, array->get(i), array->OffsetOfElementAt(i));
array->OffsetOfElementAt(i));
} }
} }
...@@ -1258,7 +1232,7 @@ void V8HeapExplorer::ExtractFeedbackVectorReferences( ...@@ -1258,7 +1232,7 @@ void V8HeapExplorer::ExtractFeedbackVectorReferences(
MaybeObject* code = feedback_vector->optimized_code_weak_or_smi(); MaybeObject* code = feedback_vector->optimized_code_weak_or_smi();
HeapObject* code_heap_object; HeapObject* code_heap_object;
if (code->GetHeapObjectIfWeak(&code_heap_object)) { if (code->GetHeapObjectIfWeak(&code_heap_object)) {
SetWeakReference(feedback_vector, entry, "optimized code", code_heap_object, SetWeakReference(entry, "optimized code", code_heap_object,
FeedbackVector::kOptimizedCodeOffset); FeedbackVector::kOptimizedCodeOffset);
} }
} }
...@@ -1270,10 +1244,9 @@ void V8HeapExplorer::ExtractWeakArrayReferences(int header_size, ...@@ -1270,10 +1244,9 @@ void V8HeapExplorer::ExtractWeakArrayReferences(int header_size,
MaybeObject* object = array->Get(i); MaybeObject* object = array->Get(i);
HeapObject* heap_object; HeapObject* heap_object;
if (object->GetHeapObjectIfWeak(&heap_object)) { if (object->GetHeapObjectIfWeak(&heap_object)) {
SetWeakReference(array, entry, i, heap_object, SetWeakReference(entry, i, heap_object, header_size + i * kPointerSize);
header_size + i * kPointerSize);
} else if (object->GetHeapObjectIfStrong(&heap_object)) { } else if (object->GetHeapObjectIfStrong(&heap_object)) {
SetInternalReference(array, entry, i, heap_object, SetInternalReference(entry, i, heap_object,
header_size + i * kPointerSize); header_size + i * kPointerSize);
} }
} }
...@@ -1298,12 +1271,12 @@ void V8HeapExplorer::ExtractPropertyReferences(JSObject* js_obj, ...@@ -1298,12 +1271,12 @@ void V8HeapExplorer::ExtractPropertyReferences(JSObject* js_obj,
int field_offset = int field_offset =
field_index.is_inobject() ? field_index.offset() : -1; field_index.is_inobject() ? field_index.offset() : -1;
SetDataOrAccessorPropertyReference(details.kind(), js_obj, entry, k, SetDataOrAccessorPropertyReference(details.kind(), entry, k, value,
value, nullptr, field_offset); nullptr, field_offset);
break; break;
} }
case kDescriptor: case kDescriptor:
SetDataOrAccessorPropertyReference(details.kind(), js_obj, entry, SetDataOrAccessorPropertyReference(details.kind(), entry,
descs->GetKey(i), descs->GetKey(i),
descs->GetStrongValue(i)); descs->GetStrongValue(i));
break; break;
...@@ -1316,14 +1289,12 @@ void V8HeapExplorer::ExtractPropertyReferences(JSObject* js_obj, ...@@ -1316,14 +1289,12 @@ void V8HeapExplorer::ExtractPropertyReferences(JSObject* js_obj,
int length = dictionary->Capacity(); int length = dictionary->Capacity();
ReadOnlyRoots roots(isolate); ReadOnlyRoots roots(isolate);
for (int i = 0; i < length; ++i) { for (int i = 0; i < length; ++i) {
if (dictionary->IsKey(roots, dictionary->KeyAt(i))) { if (!dictionary->IsKey(roots, dictionary->KeyAt(i))) continue;
PropertyCell* cell = dictionary->CellAt(i); PropertyCell* cell = dictionary->CellAt(i);
Name* name = cell->name(); Name* name = cell->name();
Object* value = cell->value(); Object* value = cell->value();
PropertyDetails details = cell->property_details(); PropertyDetails details = cell->property_details();
SetDataOrAccessorPropertyReference(details.kind(), js_obj, entry, name, SetDataOrAccessorPropertyReference(details.kind(), entry, name, value);
value);
}
} }
} else { } else {
NameDictionary* dictionary = js_obj->property_dictionary(); NameDictionary* dictionary = js_obj->property_dictionary();
...@@ -1331,30 +1302,28 @@ void V8HeapExplorer::ExtractPropertyReferences(JSObject* js_obj, ...@@ -1331,30 +1302,28 @@ void V8HeapExplorer::ExtractPropertyReferences(JSObject* js_obj,
ReadOnlyRoots roots(isolate); ReadOnlyRoots roots(isolate);
for (int i = 0; i < length; ++i) { for (int i = 0; i < length; ++i) {
Object* k = dictionary->KeyAt(i); Object* k = dictionary->KeyAt(i);
if (dictionary->IsKey(roots, k)) { if (!dictionary->IsKey(roots, k)) continue;
Object* value = dictionary->ValueAt(i); Object* value = dictionary->ValueAt(i);
PropertyDetails details = dictionary->DetailsAt(i); PropertyDetails details = dictionary->DetailsAt(i);
SetDataOrAccessorPropertyReference(details.kind(), js_obj, entry, SetDataOrAccessorPropertyReference(details.kind(), entry, Name::cast(k),
Name::cast(k), value); value);
}
} }
} }
} }
void V8HeapExplorer::ExtractAccessorPairProperty(JSObject* js_obj, void V8HeapExplorer::ExtractAccessorPairProperty(HeapEntry* entry, Name* key,
HeapEntry* entry, Name* key,
Object* callback_obj, Object* callback_obj,
int field_offset) { int field_offset) {
if (!callback_obj->IsAccessorPair()) return; if (!callback_obj->IsAccessorPair()) return;
AccessorPair* accessors = AccessorPair::cast(callback_obj); AccessorPair* accessors = AccessorPair::cast(callback_obj);
SetPropertyReference(js_obj, entry, key, accessors, nullptr, field_offset); SetPropertyReference(entry, key, accessors, nullptr, field_offset);
Object* getter = accessors->getter(); Object* getter = accessors->getter();
if (!getter->IsOddball()) { if (!getter->IsOddball()) {
SetPropertyReference(js_obj, entry, key, getter, "get %s"); SetPropertyReference(entry, key, getter, "get %s");
} }
Object* setter = accessors->setter(); Object* setter = accessors->setter();
if (!setter->IsOddball()) { if (!setter->IsOddball()) {
SetPropertyReference(js_obj, entry, key, setter, "set %s"); SetPropertyReference(entry, key, setter, "set %s");
} }
} }
...@@ -1368,7 +1337,7 @@ void V8HeapExplorer::ExtractElementReferences(JSObject* js_obj, ...@@ -1368,7 +1337,7 @@ void V8HeapExplorer::ExtractElementReferences(JSObject* js_obj,
: elements->length(); : elements->length();
for (int i = 0; i < length; ++i) { for (int i = 0; i < length; ++i) {
if (!elements->get(i)->IsTheHole(roots)) { if (!elements->get(i)->IsTheHole(roots)) {
SetElementReference(js_obj, entry, i, elements->get(i)); SetElementReference(entry, i, elements->get(i));
} }
} }
} else if (js_obj->HasDictionaryElements()) { } else if (js_obj->HasDictionaryElements()) {
...@@ -1376,11 +1345,10 @@ void V8HeapExplorer::ExtractElementReferences(JSObject* js_obj, ...@@ -1376,11 +1345,10 @@ void V8HeapExplorer::ExtractElementReferences(JSObject* js_obj,
int length = dictionary->Capacity(); int length = dictionary->Capacity();
for (int i = 0; i < length; ++i) { for (int i = 0; i < length; ++i) {
Object* k = dictionary->KeyAt(i); Object* k = dictionary->KeyAt(i);
if (dictionary->IsKey(roots, k)) { if (!dictionary->IsKey(roots, k)) continue;
DCHECK(k->IsNumber()); DCHECK(k->IsNumber());
uint32_t index = static_cast<uint32_t>(k->Number()); uint32_t index = static_cast<uint32_t>(k->Number());
SetElementReference(js_obj, entry, index, dictionary->ValueAt(i)); SetElementReference(entry, index, dictionary->ValueAt(i));
}
} }
} }
} }
...@@ -1390,8 +1358,7 @@ void V8HeapExplorer::ExtractInternalReferences(JSObject* js_obj, ...@@ -1390,8 +1358,7 @@ void V8HeapExplorer::ExtractInternalReferences(JSObject* js_obj,
int length = js_obj->GetEmbedderFieldCount(); int length = js_obj->GetEmbedderFieldCount();
for (int i = 0; i < length; ++i) { for (int i = 0; i < length; ++i) {
Object* o = js_obj->GetEmbedderField(i); Object* o = js_obj->GetEmbedderField(i);
SetInternalReference(js_obj, entry, i, o, SetInternalReference(entry, i, o, js_obj->GetEmbedderFieldOffset(i));
js_obj->GetEmbedderFieldOffset(i));
} }
} }
...@@ -1415,7 +1382,6 @@ String* V8HeapExplorer::GetConstructorName(JSObject* object) { ...@@ -1415,7 +1382,6 @@ String* V8HeapExplorer::GetConstructorName(JSObject* object) {
return *JSReceiver::GetConstructorName(handle(object, isolate)); return *JSReceiver::GetConstructorName(handle(object, isolate));
} }
HeapEntry* V8HeapExplorer::GetEntry(Object* obj) { HeapEntry* V8HeapExplorer::GetEntry(Object* obj) {
return obj->IsHeapObject() ? generator_->FindOrAddEntry(obj, this) : nullptr; return obj->IsHeapObject() ? generator_->FindOrAddEntry(obj, this) : nullptr;
} }
...@@ -1483,7 +1449,7 @@ bool V8HeapExplorer::IterateAndExtractReferences( ...@@ -1483,7 +1449,7 @@ bool V8HeapExplorer::IterateAndExtractReferences(
HeapEntry* entry = GetEntry(obj); HeapEntry* entry = GetEntry(obj);
ExtractReferences(entry, obj); ExtractReferences(entry, obj);
SetInternalReference(obj, entry, "map", obj->map(), HeapObject::kMapOffset); SetInternalReference(entry, "map", obj->map(), HeapObject::kMapOffset);
// Extract unvisited fields as hidden references and restore tags // Extract unvisited fields as hidden references and restore tags
// of visited fields. // of visited fields.
IndexedReferencesExtractor refs_extractor(this, obj, entry); IndexedReferencesExtractor refs_extractor(this, obj, entry);
...@@ -1534,11 +1500,9 @@ bool V8HeapExplorer::IsEssentialHiddenReference(Object* parent, ...@@ -1534,11 +1500,9 @@ bool V8HeapExplorer::IsEssentialHiddenReference(Object* parent,
return true; return true;
} }
void V8HeapExplorer::SetContextReference(HeapObject* parent_obj, void V8HeapExplorer::SetContextReference(HeapEntry* parent_entry,
HeapEntry* parent_entry,
String* reference_name, String* reference_name,
Object* child_obj, int field_offset) { Object* child_obj, int field_offset) {
DCHECK_EQ(parent_entry, GetEntry(parent_obj));
HeapEntry* child_entry = GetEntry(child_obj); HeapEntry* child_entry = GetEntry(child_obj);
if (child_entry == nullptr) return; if (child_entry == nullptr) return;
parent_entry->SetNamedReference(HeapGraphEdge::kContextVariable, parent_entry->SetNamedReference(HeapGraphEdge::kContextVariable,
...@@ -1553,32 +1517,26 @@ void V8HeapExplorer::MarkVisitedField(int offset) { ...@@ -1553,32 +1517,26 @@ void V8HeapExplorer::MarkVisitedField(int offset) {
visited_fields_[index] = true; visited_fields_[index] = true;
} }
void V8HeapExplorer::SetNativeBindReference(HeapObject* parent_obj, void V8HeapExplorer::SetNativeBindReference(HeapEntry* parent_entry,
HeapEntry* parent_entry,
const char* reference_name, const char* reference_name,
Object* child_obj) { Object* child_obj) {
DCHECK_EQ(parent_entry, GetEntry(parent_obj));
HeapEntry* child_entry = GetEntry(child_obj); HeapEntry* child_entry = GetEntry(child_obj);
if (child_entry == nullptr) return; if (child_entry == nullptr) return;
parent_entry->SetNamedReference(HeapGraphEdge::kShortcut, reference_name, parent_entry->SetNamedReference(HeapGraphEdge::kShortcut, reference_name,
child_entry); child_entry);
} }
void V8HeapExplorer::SetElementReference(HeapObject* parent_obj, void V8HeapExplorer::SetElementReference(HeapEntry* parent_entry, int index,
HeapEntry* parent_entry, int index,
Object* child_obj) { Object* child_obj) {
DCHECK_EQ(parent_entry, GetEntry(parent_obj));
HeapEntry* child_entry = GetEntry(child_obj); HeapEntry* child_entry = GetEntry(child_obj);
if (child_entry == nullptr) return; if (child_entry == nullptr) return;
parent_entry->SetIndexedReference(HeapGraphEdge::kElement, index, parent_entry->SetIndexedReference(HeapGraphEdge::kElement, index,
child_entry); child_entry);
} }
void V8HeapExplorer::SetInternalReference(HeapObject* parent_obj, void V8HeapExplorer::SetInternalReference(HeapEntry* parent_entry,
HeapEntry* parent_entry,
const char* reference_name, const char* reference_name,
Object* child_obj, int field_offset) { Object* child_obj, int field_offset) {
DCHECK_EQ(parent_entry, GetEntry(parent_obj));
HeapEntry* child_entry = GetEntry(child_obj); HeapEntry* child_entry = GetEntry(child_obj);
if (child_entry == nullptr) return; if (child_entry == nullptr) return;
if (IsEssentialObject(child_obj)) { if (IsEssentialObject(child_obj)) {
...@@ -1588,10 +1546,8 @@ void V8HeapExplorer::SetInternalReference(HeapObject* parent_obj, ...@@ -1588,10 +1546,8 @@ void V8HeapExplorer::SetInternalReference(HeapObject* parent_obj,
MarkVisitedField(field_offset); MarkVisitedField(field_offset);
} }
void V8HeapExplorer::SetInternalReference(HeapObject* parent_obj, void V8HeapExplorer::SetInternalReference(HeapEntry* parent_entry, int index,
HeapEntry* parent_entry, int index,
Object* child_obj, int field_offset) { Object* child_obj, int field_offset) {
DCHECK_EQ(parent_entry, GetEntry(parent_obj));
HeapEntry* child_entry = GetEntry(child_obj); HeapEntry* child_entry = GetEntry(child_obj);
if (child_entry == nullptr) return; if (child_entry == nullptr) return;
if (IsEssentialObject(child_obj)) { if (IsEssentialObject(child_obj)) {
...@@ -1613,11 +1569,9 @@ void V8HeapExplorer::SetHiddenReference(HeapObject* parent_obj, ...@@ -1613,11 +1569,9 @@ void V8HeapExplorer::SetHiddenReference(HeapObject* parent_obj,
} }
} }
void V8HeapExplorer::SetWeakReference(HeapObject* parent_obj, void V8HeapExplorer::SetWeakReference(HeapEntry* parent_entry,
HeapEntry* parent_entry,
const char* reference_name, const char* reference_name,
Object* child_obj, int field_offset) { Object* child_obj, int field_offset) {
DCHECK_EQ(parent_entry, GetEntry(parent_obj));
HeapEntry* child_entry = GetEntry(child_obj); HeapEntry* child_entry = GetEntry(child_obj);
if (child_entry == nullptr) return; if (child_entry == nullptr) return;
if (IsEssentialObject(child_obj)) { if (IsEssentialObject(child_obj)) {
...@@ -1627,10 +1581,8 @@ void V8HeapExplorer::SetWeakReference(HeapObject* parent_obj, ...@@ -1627,10 +1581,8 @@ void V8HeapExplorer::SetWeakReference(HeapObject* parent_obj,
MarkVisitedField(field_offset); MarkVisitedField(field_offset);
} }
void V8HeapExplorer::SetWeakReference(HeapObject* parent_obj, void V8HeapExplorer::SetWeakReference(HeapEntry* parent_entry, int index,
HeapEntry* parent_entry, int index,
Object* child_obj, int field_offset) { Object* child_obj, int field_offset) {
DCHECK_EQ(parent_entry, GetEntry(parent_obj));
HeapEntry* child_entry = GetEntry(child_obj); HeapEntry* child_entry = GetEntry(child_obj);
if (child_entry == nullptr) return; if (child_entry == nullptr) return;
if (IsEssentialObject(child_obj)) { if (IsEssentialObject(child_obj)) {
...@@ -1641,23 +1593,22 @@ void V8HeapExplorer::SetWeakReference(HeapObject* parent_obj, ...@@ -1641,23 +1593,22 @@ void V8HeapExplorer::SetWeakReference(HeapObject* parent_obj,
} }
void V8HeapExplorer::SetDataOrAccessorPropertyReference( void V8HeapExplorer::SetDataOrAccessorPropertyReference(
PropertyKind kind, JSObject* parent_obj, HeapEntry* parent_entry, PropertyKind kind, HeapEntry* parent_entry, Name* reference_name,
Name* reference_name, Object* child_obj, const char* name_format_string, Object* child_obj, const char* name_format_string, int field_offset) {
int field_offset) {
DCHECK_EQ(parent_entry, GetEntry(parent_obj));
if (kind == kAccessor) { if (kind == kAccessor) {
ExtractAccessorPairProperty(parent_obj, parent_entry, reference_name, ExtractAccessorPairProperty(parent_entry, reference_name, child_obj,
child_obj, field_offset); field_offset);
} else { } else {
SetPropertyReference(parent_obj, parent_entry, reference_name, child_obj, SetPropertyReference(parent_entry, reference_name, child_obj,
name_format_string, field_offset); name_format_string, field_offset);
} }
} }
void V8HeapExplorer::SetPropertyReference( void V8HeapExplorer::SetPropertyReference(HeapEntry* parent_entry,
HeapObject* parent_obj, HeapEntry* parent_entry, Name* reference_name, Name* reference_name,
Object* child_obj, const char* name_format_string, int field_offset) { Object* child_obj,
DCHECK_EQ(parent_entry, GetEntry(parent_obj)); const char* name_format_string,
int field_offset) {
HeapEntry* child_entry = GetEntry(child_obj); HeapEntry* child_entry = GetEntry(child_obj);
if (child_entry == nullptr) return; if (child_entry == nullptr) return;
HeapGraphEdge::Type type = HeapGraphEdge::Type type =
......
...@@ -381,42 +381,37 @@ class V8HeapExplorer : public HeapEntriesAllocator { ...@@ -381,42 +381,37 @@ class V8HeapExplorer : public HeapEntriesAllocator {
template <typename T> template <typename T>
void ExtractWeakArrayReferences(int header_size, HeapEntry* entry, T* array); void ExtractWeakArrayReferences(int header_size, HeapEntry* entry, T* array);
void ExtractPropertyReferences(JSObject* js_obj, HeapEntry* entry); void ExtractPropertyReferences(JSObject* js_obj, HeapEntry* entry);
void ExtractAccessorPairProperty(JSObject* js_obj, HeapEntry* entry, void ExtractAccessorPairProperty(HeapEntry* entry, Name* key,
Name* key, Object* callback_obj, Object* callback_obj, int field_offset = -1);
int field_offset = -1);
void ExtractElementReferences(JSObject* js_obj, HeapEntry* entry); void ExtractElementReferences(JSObject* js_obj, HeapEntry* entry);
void ExtractInternalReferences(JSObject* js_obj, HeapEntry* entry); void ExtractInternalReferences(JSObject* js_obj, HeapEntry* entry);
bool IsEssentialObject(Object* object); bool IsEssentialObject(Object* object);
bool IsEssentialHiddenReference(Object* parent, int field_offset); bool IsEssentialHiddenReference(Object* parent, int field_offset);
void SetContextReference(HeapObject* parent_obj, HeapEntry* parent_entry, void SetContextReference(HeapEntry* parent_entry, String* reference_name,
String* reference_name, Object* child, Object* child, int field_offset);
int field_offset); void SetNativeBindReference(HeapEntry* parent_entry,
void SetNativeBindReference(HeapObject* parent_obj, HeapEntry* parent_entry,
const char* reference_name, Object* child); const char* reference_name, Object* child);
void SetElementReference(HeapObject* parent_obj, HeapEntry* parent_entry, void SetElementReference(HeapEntry* parent_entry, int index, Object* child);
int index, Object* child); void SetInternalReference(HeapEntry* parent_entry, const char* reference_name,
void SetInternalReference(HeapObject* parent_obj, HeapEntry* parent_entry, Object* child, int field_offset = -1);
const char* reference_name, Object* child, void SetInternalReference(HeapEntry* parent_entry, int index, Object* child,
int field_offset = -1); int field_offset = -1);
void SetInternalReference(HeapObject* parent_obj, HeapEntry* parent_entry,
int index, Object* child, int field_offset = -1);
void SetHiddenReference(HeapObject* parent_obj, HeapEntry* parent_entry, void SetHiddenReference(HeapObject* parent_obj, HeapEntry* parent_entry,
int index, Object* child, int field_offset); int index, Object* child, int field_offset);
void SetWeakReference(HeapObject* parent_obj, HeapEntry* parent_entry, void SetWeakReference(HeapEntry* parent_entry, const char* reference_name,
const char* reference_name, Object* child_obj, Object* child_obj, int field_offset);
void SetWeakReference(HeapEntry* parent_entry, int index, Object* child_obj,
int field_offset); int field_offset);
void SetWeakReference(HeapObject* parent_obj, HeapEntry* parent_entry, void SetPropertyReference(HeapEntry* parent_entry, Name* reference_name,
int index, Object* child_obj, int field_offset); Object* child,
void SetPropertyReference(HeapObject* parent_obj, HeapEntry* parent_entry,
Name* reference_name, Object* child,
const char* name_format_string = nullptr, const char* name_format_string = nullptr,
int field_offset = -1); int field_offset = -1);
void SetDataOrAccessorPropertyReference( void SetDataOrAccessorPropertyReference(
PropertyKind kind, JSObject* parent_obj, HeapEntry* parent_entry, PropertyKind kind, HeapEntry* parent_entry, Name* reference_name,
Name* reference_name, Object* child, Object* child, const char* name_format_string = nullptr,
const char* name_format_string = nullptr, int field_offset = -1); int field_offset = -1);
void SetUserGlobalReference(Object* user_global); void SetUserGlobalReference(Object* user_global);
void SetRootGcRootsReference(); void SetRootGcRootsReference();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment