| Index: src/profile-generator.cc
|
| diff --git a/src/profile-generator.cc b/src/profile-generator.cc
|
| index a0429f3c3aee2a3b363ee96b08118b2d01e7a066..4f4b76b637a900c63a2766c0620dda87c002ac9e 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) {
|
|
|