| Index: src/heap-snapshot-generator.cc
|
| diff --git a/src/heap-snapshot-generator.cc b/src/heap-snapshot-generator.cc
|
| index 887e9f56bbf1c92407d2a5912ca9b52a75b36472..8c8182e8dba617423c1cfa1e2d82b4e52749948a 100644
|
| --- a/src/heap-snapshot-generator.cc
|
| +++ b/src/heap-snapshot-generator.cc
|
| @@ -47,8 +47,7 @@ HeapGraphEdge::HeapGraphEdge(Type type, const char* name, int from, int to)
|
| ASSERT(type == kContextVariable
|
| || type == kProperty
|
| || type == kInternal
|
| - || type == kShortcut
|
| - || type == kWeak);
|
| + || type == kShortcut);
|
| }
|
|
|
|
|
| @@ -57,7 +56,7 @@ HeapGraphEdge::HeapGraphEdge(Type type, int index, int from, int to)
|
| from_index_(from),
|
| to_index_(to),
|
| index_(index) {
|
| - ASSERT(type == kElement || type == kHidden);
|
| + ASSERT(type == kElement || type == kHidden || type == kWeak);
|
| }
|
|
|
|
|
| @@ -151,7 +150,7 @@ void HeapEntry::Print(
|
| break;
|
| case HeapGraphEdge::kWeak:
|
| edge_prefix = "w";
|
| - edge_name = edge.name();
|
| + OS::SNPrintF(index, "%d", edge.index());
|
| break;
|
| default:
|
| OS::SNPrintF(index, "!!! unknown edge type: %d ", edge.type());
|
| @@ -1115,13 +1114,11 @@ void V8HeapExplorer::ExtractJSObjectReferences(
|
| SetInternalReference(js_fun, entry,
|
| "context", js_fun->context(),
|
| JSFunction::kContextOffset);
|
| - SetWeakReference(js_fun, entry,
|
| - "next_function_link", js_fun->next_function_link(),
|
| - JSFunction::kNextFunctionLinkOffset);
|
| - STATIC_CHECK(JSFunction::kNextFunctionLinkOffset
|
| - == JSFunction::kNonWeakFieldsEndOffset);
|
| - STATIC_CHECK(JSFunction::kNextFunctionLinkOffset + kPointerSize
|
| - == JSFunction::kSize);
|
| + for (int i = JSFunction::kNonWeakFieldsEndOffset;
|
| + i < JSFunction::kSize;
|
| + i += kPointerSize) {
|
| + SetWeakReference(js_fun, entry, i, *HeapObject::RawField(js_fun, i), i);
|
| + }
|
| } else if (obj->IsGlobalObject()) {
|
| GlobalObject* global_obj = GlobalObject::cast(obj);
|
| SetInternalReference(global_obj, entry,
|
| @@ -1137,14 +1134,13 @@ void V8HeapExplorer::ExtractJSObjectReferences(
|
| JSArrayBufferView* view = JSArrayBufferView::cast(obj);
|
| SetInternalReference(view, entry, "buffer", view->buffer(),
|
| JSArrayBufferView::kBufferOffset);
|
| - SetWeakReference(view, entry, "weak_next", view->weak_next(),
|
| + SetWeakReference(view, entry, 1, view->weak_next(),
|
| JSArrayBufferView::kWeakNextOffset);
|
| } else if (obj->IsJSArrayBuffer()) {
|
| JSArrayBuffer* buffer = JSArrayBuffer::cast(obj);
|
| - SetWeakReference(buffer, entry, "weak_next", buffer->weak_next(),
|
| + SetWeakReference(buffer, entry, 1, buffer->weak_next(),
|
| JSArrayBuffer::kWeakNextOffset);
|
| - SetWeakReference(buffer, entry,
|
| - "weak_first_view", buffer->weak_first_view(),
|
| + SetWeakReference(buffer, entry, 2, buffer->weak_first_view(),
|
| JSArrayBuffer::kWeakFirstViewOffset);
|
| }
|
| TagObject(js_obj->properties(), "(object properties)");
|
| @@ -1196,13 +1192,8 @@ void V8HeapExplorer::ExtractContextReferences(int entry, Context* context) {
|
| }
|
|
|
| #define EXTRACT_CONTEXT_FIELD(index, type, name) \
|
| - if (Context::index < Context::FIRST_WEAK_SLOT) { \
|
| - SetInternalReference(context, entry, #name, context->get(Context::index), \
|
| - FixedArray::OffsetOfElementAt(Context::index)); \
|
| - } else { \
|
| - SetWeakReference(context, entry, #name, context->get(Context::index), \
|
| - FixedArray::OffsetOfElementAt(Context::index)); \
|
| - }
|
| + SetInternalReference(context, entry, #name, context->get(Context::index), \
|
| + FixedArray::OffsetOfElementAt(Context::index));
|
| EXTRACT_CONTEXT_FIELD(CLOSURE_INDEX, JSFunction, closure);
|
| EXTRACT_CONTEXT_FIELD(PREVIOUS_INDEX, Context, previous);
|
| EXTRACT_CONTEXT_FIELD(EXTENSION_INDEX, Object, extension);
|
| @@ -1214,15 +1205,13 @@ void V8HeapExplorer::ExtractContextReferences(int entry, Context* context) {
|
| TagObject(context->runtime_context(), "(runtime context)");
|
| TagObject(context->embedder_data(), "(context data)");
|
| NATIVE_CONTEXT_FIELDS(EXTRACT_CONTEXT_FIELD);
|
| - EXTRACT_CONTEXT_FIELD(OPTIMIZED_FUNCTIONS_LIST, , optimized_functions_list);
|
| - EXTRACT_CONTEXT_FIELD(OPTIMIZED_CODE_LIST, , optimized_code_list);
|
| - EXTRACT_CONTEXT_FIELD(DEOPTIMIZED_CODE_LIST, , deoptimized_code_list);
|
| - EXTRACT_CONTEXT_FIELD(NEXT_CONTEXT_LINK, , next_context_link);
|
| #undef EXTRACT_CONTEXT_FIELD
|
| - STATIC_CHECK(Context::OPTIMIZED_FUNCTIONS_LIST == Context::FIRST_WEAK_SLOT);
|
| - STATIC_CHECK(Context::NEXT_CONTEXT_LINK + 1
|
| - == Context::NATIVE_CONTEXT_SLOTS);
|
| - STATIC_CHECK(Context::FIRST_WEAK_SLOT + 5 == Context::NATIVE_CONTEXT_SLOTS);
|
| + for (int i = Context::FIRST_WEAK_SLOT;
|
| + i < Context::NATIVE_CONTEXT_SLOTS;
|
| + ++i) {
|
| + SetWeakReference(context, entry, i, context->get(i),
|
| + FixedArray::OffsetOfElementAt(i));
|
| + }
|
| }
|
| }
|
|
|
| @@ -1316,7 +1305,7 @@ void V8HeapExplorer::ExtractSharedFunctionInfoReferences(
|
| "optimized_code_map", shared->optimized_code_map(),
|
| SharedFunctionInfo::kOptimizedCodeMapOffset);
|
| SetWeakReference(obj, entry,
|
| - "initial_map", shared->initial_map(),
|
| + 1, shared->initial_map(),
|
| SharedFunctionInfo::kInitialMapOffset);
|
| }
|
|
|
| @@ -1846,17 +1835,17 @@ void V8HeapExplorer::SetHiddenReference(HeapObject* parent_obj,
|
|
|
| void V8HeapExplorer::SetWeakReference(HeapObject* parent_obj,
|
| int parent_entry,
|
| - const char* reference_name,
|
| + 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)) {
|
| - filler_->SetNamedReference(HeapGraphEdge::kWeak,
|
| - parent_entry,
|
| - reference_name,
|
| - child_entry);
|
| + filler_->SetIndexedReference(HeapGraphEdge::kWeak,
|
| + parent_entry,
|
| + index,
|
| + child_entry);
|
| }
|
| IndexedReferencesExtractor::MarkVisitedField(parent_obj, field_offset);
|
| }
|
| @@ -1928,17 +1917,10 @@ void V8HeapExplorer::SetGcSubrootReference(
|
| name,
|
| child_entry);
|
| } else {
|
| - if (is_weak) {
|
| - filler_->SetNamedAutoIndexReference(
|
| - HeapGraphEdge::kWeak,
|
| - snapshot_->gc_subroot(tag)->index(),
|
| - child_entry);
|
| - } else {
|
| - filler_->SetIndexedAutoIndexReference(
|
| - HeapGraphEdge::kElement,
|
| - snapshot_->gc_subroot(tag)->index(),
|
| - child_entry);
|
| - }
|
| + filler_->SetIndexedAutoIndexReference(
|
| + is_weak ? HeapGraphEdge::kWeak : HeapGraphEdge::kElement,
|
| + snapshot_->gc_subroot(tag)->index(),
|
| + child_entry);
|
| }
|
|
|
| // Add a shortcut to JS global object reference at snapshot root.
|
| @@ -2672,6 +2654,7 @@ void HeapSnapshotJSONSerializer::SerializeEdge(HeapGraphEdge* edge,
|
| EmbeddedVector<char, kBufferSize> buffer;
|
| int edge_name_or_index = edge->type() == HeapGraphEdge::kElement
|
| || edge->type() == HeapGraphEdge::kHidden
|
| + || edge->type() == HeapGraphEdge::kWeak
|
| ? edge->index() : GetStringId(edge->name());
|
| int buffer_pos = 0;
|
| if (!first_edge) {
|
|
|