Show names of the context fields in heap snapshot.
authoralexeif@chromium.org <alexeif@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Mon, 23 Apr 2012 16:10:35 +0000 (16:10 +0000)
committeralexeif@chromium.org <alexeif@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Mon, 23 Apr 2012 16:10:35 +0000 (16:10 +0000)
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

index a0429f3c3aee2a3b363ee96b08118b2d01e7a066..4f4b76b637a900c63a2766c0620dda87c002ac9e 100644 (file)
@@ -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) {