From ba6500b01804cac913369a64a102c58432bbb570 Mon Sep 17 00:00:00 2001 From: "alexeif@chromium.org" Date: Mon, 23 Apr 2012 16:10:35 +0000 Subject: [PATCH] Show names of the context fields in heap snapshot. Review URL: https://chromiumcodereview.appspot.com/10183005 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@11418 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/profile-generator.cc | 40 +++++++++++++++++++++++++--------------- 1 file changed, 25 insertions(+), 15 deletions(-) diff --git a/src/profile-generator.cc b/src/profile-generator.cc index a0429f3c3a..4f4b76b637 100644 --- a/src/profile-generator.cc +++ b/src/profile-generator.cc @@ -2068,19 +2068,30 @@ void V8HeapExplorer::ExtractReferences(HeapObject* obj) { SetInternalReference(obj, entry, "parent", ss->parent()); } extract_indexed_refs = false; - } else if (obj->IsGlobalContext()) { + } else if (obj->IsContext()) { Context* context = Context::cast(obj); - TagObject(context->jsfunction_result_caches(), - "(context func. result caches)"); - TagObject(context->normalized_map_cache(), "(context norm. map cache)"); - TagObject(context->runtime_context(), "(runtime context)"); - TagObject(context->data(), "(context data)"); - for (int i = Context::FIRST_WEAK_SLOT; - i < Context::GLOBAL_CONTEXT_SLOTS; - ++i) { - SetWeakReference(obj, entry, - i, context->get(i), - FixedArray::OffsetOfElementAt(i)); +#define EXTRACT_CONTEXT_FIELD(index, type, name) \ + 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); + EXTRACT_CONTEXT_FIELD(GLOBAL_INDEX, GlobalObject, global); + if (obj->IsGlobalContext()) { + TagObject(context->jsfunction_result_caches(), + "(context func. result caches)"); + TagObject(context->normalized_map_cache(), "(context norm. map cache)"); + TagObject(context->runtime_context(), "(runtime context)"); + TagObject(context->data(), "(context data)"); + GLOBAL_CONTEXT_FIELDS(EXTRACT_CONTEXT_FIELD); +#undef EXTRACT_CONTEXT_FIELD + for (int i = Context::FIRST_WEAK_SLOT; + i < Context::GLOBAL_CONTEXT_SLOTS; + ++i) { + SetWeakReference(obj, entry, + i, context->get(i), + FixedArray::OffsetOfElementAt(i)); + } } } else if (obj->IsMap()) { Map* map = Map::cast(obj); @@ -2187,9 +2198,6 @@ void V8HeapExplorer::ExtractClosureReferences(JSObject* js_obj, if (!js_obj->IsJSFunction()) return; JSFunction* func = JSFunction::cast(js_obj); - Context* context = func->context()->declaration_context(); - ScopeInfo* scope_info = context->closure()->shared()->scope_info(); - if (func->shared()->bound()) { FixedArray* bindings = func->function_bindings(); SetNativeBindReference(js_obj, entry, "bound_this", @@ -2205,6 +2213,8 @@ void V8HeapExplorer::ExtractClosureReferences(JSObject* js_obj, bindings->get(i)); } } else { + Context* context = func->context()->declaration_context(); + ScopeInfo* scope_info = context->closure()->shared()->scope_info(); // Add context allocated locals. int context_locals = scope_info->ContextLocalCount(); for (int i = 0; i < context_locals; ++i) {