Revision: 11358
Author:   [email protected]
Date:     Tue Apr 17 08:57:35 2012
Log:      Remove Debug object from the user roots in heap profiler.

Review URL: https://chromiumcodereview.appspot.com/10096016
http://code.google.com/p/v8/source/detail?r=11358

Modified:
 /branches/bleeding_edge/src/profile-generator.cc
 /branches/bleeding_edge/src/profile-generator.h
 /branches/bleeding_edge/test/cctest/test-heap-profiler.cc

=======================================
--- /branches/bleeding_edge/src/profile-generator.cc Tue Apr 17 06:10:17 2012 +++ /branches/bleeding_edge/src/profile-generator.cc Tue Apr 17 08:57:35 2012
@@ -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 @@
   snapshot_ = snapshot;
   type_ = type;
   painted_ = false;
-  reachable_from_window_ = false;
+  user_reachable_ = false;
   name_ = name;
   self_size_ = self_size;
   retained_size_ = 0;
@@ -1981,7 +1982,15 @@
     // 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);
@@ -2626,7 +2635,7 @@
 }


-void V8HeapExplorer::SetWindowReference(Object* child_obj) {
+void V8HeapExplorer::SetUserGlobalReference(Object* child_obj) {
   HeapEntry* child_entry = GetEntry(child_obj);
   ASSERT(child_entry != NULL);
   filler_->SetNamedAutoIndexReference(
@@ -3262,30 +3271,30 @@
 }


-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);
       }
     }
@@ -3298,8 +3307,8 @@
   // 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();
 }


@@ -3407,7 +3416,7 @@


 bool HeapSnapshotGenerator::SetEntriesDominators() {
-  MarkWindowReachableObjects();
+  MarkUserReachableObjects();
   // This array is used for maintaining postorder of nodes.
   ScopedVector<HeapEntry*> ordered_entries(snapshot_->entries()->length());
   FillPostorderIndexes(&ordered_entries);
=======================================
--- /branches/bleeding_edge/src/profile-generator.h     Tue Apr 17 06:10:17 2012
+++ /branches/bleeding_edge/src/profile-generator.h     Tue Apr 17 08:57:35 2012
@@ -563,8 +563,8 @@
   void clear_paint() { painted_ = false; }
   bool painted() { return painted_; }
   void paint() { painted_ = true; }
-  bool reachable_from_window() { return reachable_from_window_; }
-  void set_reachable_from_window() { reachable_from_window_ = true; }
+  bool user_reachable() { return user_reachable_; }
+  void set_user_reachable() { user_reachable_ = true; }

   void SetIndexedReference(HeapGraphEdge::Type type,
                            int child_index,
@@ -601,7 +601,7 @@
   const char* TypeAsString();

   unsigned painted_: 1;
-  unsigned reachable_from_window_: 1;
+  unsigned user_reachable_: 1;
   unsigned type_: 4;
   int children_count_: 26;
   int retainers_count_;
@@ -1020,7 +1020,7 @@
                                     HeapEntry* parent,
                                     String* reference_name,
                                     Object* child);
-  void SetWindowReference(Object* window);
+  void SetUserGlobalReference(Object* window);
   void SetRootGcRootsReference();
   void SetGcRootsReference(VisitorSynchronization::SyncTag tag);
   void SetGcSubrootReference(
@@ -1125,8 +1125,8 @@
   bool CountEntriesAndReferences();
   bool FillReferences();
   void FillPostorderIndexes(Vector<HeapEntry*>* entries);
-  bool IsWindowReference(const HeapGraphEdge& edge);
-  void MarkWindowReachableObjects();
+  bool IsUserGlobalReference(const HeapGraphEdge& edge);
+  void MarkUserReachableObjects();
   void ProgressStep();
   bool ProgressReport(bool force = false);
   bool SetEntriesDominators();
=======================================
--- /branches/bleeding_edge/test/cctest/test-heap-profiler.cc Tue Apr 17 06:10:17 2012 +++ /branches/bleeding_edge/test/cctest/test-heap-profiler.cc Tue Apr 17 08:57:35 2012
@@ -7,6 +7,7 @@
 #include "cctest.h"
 #include "heap-profiler.h"
 #include "snapshot.h"
+#include "debug.h"
 #include "utils-inl.h"
 #include "../include/v8-profiler.h"

@@ -1562,6 +1563,30 @@
       GetProperty(fun, v8::HeapGraphEdge::kInternal, "shared");
   CHECK(HasWeakEdge(shared));
 }
+
+
+TEST(NoDebugObjectInSnapshot) {
+  v8::HandleScope scope;
+  LocalContext env;
+
+  v8::internal::Isolate::Current()->debug()->Load();
+  CompileRun("foo = {};");
+  const v8::HeapSnapshot* snapshot =
+      v8::HeapProfiler::TakeSnapshot(v8_str("snapshot"));
+  const v8::HeapGraphNode* root = snapshot->GetRoot();
+  int globals_count = 0;
+  for (int i = 0; i < root->GetChildrenCount(); ++i) {
+    const v8::HeapGraphEdge* edge = root->GetChild(i);
+    if (edge->GetType() == v8::HeapGraphEdge::kShortcut) {
+      ++globals_count;
+      const v8::HeapGraphNode* global = edge->GetToNode();
+      const v8::HeapGraphNode* foo =
+          GetProperty(global, v8::HeapGraphEdge::kProperty, "foo");
+      CHECK_NE(NULL, foo);
+    }
+  }
+  CHECK_EQ(1, globals_count);
+}


 TEST(PersistentHandleCount) {

--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev

Reply via email to