Index: src/profile-generator.cc |
diff --git a/src/profile-generator.cc b/src/profile-generator.cc |
index ec08f8dca806b0f34985ca4dbd859b8e464ce9eb..e4fa582ff062cba5fa31ed0f90edbaebc3e8ab01 100644 |
--- a/src/profile-generator.cc |
+++ b/src/profile-generator.cc |
@@ -34,6 +34,7 @@ |
#include "scopeinfo.h" |
#include "unicode.h" |
#include "zone-inl.h" |
+#include "debug.h" |
namespace v8 { |
namespace internal { |
@@ -967,7 +968,7 @@ void HeapEntry::Init(HeapSnapshot* snapshot, |
snapshot_ = snapshot; |
type_ = type; |
painted_ = false; |
- reachable_from_window_ = false; |
+ user_reachable_ = false; |
name_ = name; |
self_size_ = self_size; |
retained_size_ = 0; |
@@ -1986,7 +1987,15 @@ void V8HeapExplorer::ExtractReferences(HeapObject* obj) { |
// We use JSGlobalProxy because this is what embedder (e.g. browser) |
// uses for the global object. |
JSGlobalProxy* proxy = JSGlobalProxy::cast(obj); |
- SetWindowReference(proxy->map()->prototype()); |
+ Object* object = proxy->map()->prototype(); |
+ bool is_debug_object = false; |
+#ifdef ENABLE_DEBUGGER_SUPPORT |
+ is_debug_object = object->IsGlobalObject() && |
+ Isolate::Current()->debug()->IsDebugGlobal(GlobalObject::cast(object)); |
+#endif |
+ if (!is_debug_object) { |
+ SetUserGlobalReference(object); |
+ } |
} else if (obj->IsJSObject()) { |
JSObject* js_obj = JSObject::cast(obj); |
ExtractClosureReferences(js_obj, entry); |
@@ -2631,7 +2640,7 @@ void V8HeapExplorer::SetRootGcRootsReference() { |
} |
-void V8HeapExplorer::SetWindowReference(Object* child_obj) { |
+void V8HeapExplorer::SetUserGlobalReference(Object* child_obj) { |
HeapEntry* child_entry = GetEntry(child_obj); |
ASSERT(child_entry != NULL); |
filler_->SetNamedAutoIndexReference( |
@@ -3267,30 +3276,30 @@ bool HeapSnapshotGenerator::FillReferences() { |
} |
-bool HeapSnapshotGenerator::IsWindowReference(const HeapGraphEdge& edge) { |
+bool HeapSnapshotGenerator::IsUserGlobalReference(const HeapGraphEdge& edge) { |
ASSERT(edge.from() == snapshot_->root()); |
return edge.type() == HeapGraphEdge::kShortcut; |
} |
-void HeapSnapshotGenerator::MarkWindowReachableObjects() { |
+void HeapSnapshotGenerator::MarkUserReachableObjects() { |
List<HeapEntry*> worklist; |
Vector<HeapGraphEdge> children = snapshot_->root()->children(); |
for (int i = 0; i < children.length(); ++i) { |
- if (IsWindowReference(children[i])) { |
+ if (IsUserGlobalReference(children[i])) { |
worklist.Add(children[i].to()); |
} |
} |
while (!worklist.is_empty()) { |
HeapEntry* entry = worklist.RemoveLast(); |
- if (entry->reachable_from_window()) continue; |
- entry->set_reachable_from_window(); |
+ if (entry->user_reachable()) continue; |
+ entry->set_user_reachable(); |
Vector<HeapGraphEdge> children = entry->children(); |
for (int i = 0; i < children.length(); ++i) { |
HeapEntry* child = children[i].to(); |
- if (!child->reachable_from_window()) { |
+ if (!child->user_reachable()) { |
worklist.Add(child); |
} |
} |
@@ -3303,8 +3312,8 @@ static bool IsRetainingEdge(HeapGraphEdge* edge) { |
// The edge is not retaining if it goes from system domain |
// (i.e. an object not reachable from window) to the user domain |
// (i.e. a reachable object). |
- return edge->from()->reachable_from_window() |
- || !edge->to()->reachable_from_window(); |
+ return edge->from()->user_reachable() |
+ || !edge->to()->user_reachable(); |
} |
@@ -3412,7 +3421,7 @@ bool HeapSnapshotGenerator::BuildDominatorTree( |
bool HeapSnapshotGenerator::SetEntriesDominators() { |
- MarkWindowReachableObjects(); |
+ MarkUserReachableObjects(); |
// This array is used for maintaining postorder of nodes. |
ScopedVector<HeapEntry*> ordered_entries(snapshot_->entries()->length()); |
FillPostorderIndexes(&ordered_entries); |