Browse Source

Add method to dump the JSComponent instances by classname

Josh Engebretson 10 years ago
parent
commit
d81af3aae4
2 changed files with 47 additions and 0 deletions
  1. 45 0
      Source/AtomicJS/Javascript/JSMetrics.cpp
  2. 2 0
      Source/AtomicJS/Javascript/JSMetrics.h

+ 45 - 0
Source/AtomicJS/Javascript/JSMetrics.cpp

@@ -2,6 +2,7 @@
 #include <Atomic/Container/Sort.h>
 #include <Atomic/Container/Sort.h>
 
 
 #include "JSVM.h"
 #include "JSVM.h"
+#include "JSComponent.h"
 #include "JSMetrics.h"
 #include "JSMetrics.h"
 
 
 namespace Atomic
 namespace Atomic
@@ -45,10 +46,54 @@ void JSMetrics::Dump()
     }
     }
 }
 }
 
 
+void JSMetrics::DumpJSComponents()
+{
+    Vector<String> jsnames;
+    HashMap<StringHash, int> jscomponents;
+
+    HashMap<void*, RefCounted*>::ConstIterator itr = vm_->heapToObject_.Begin();
+    while (itr != vm_->heapToObject_.End())
+    {
+        String classname = "RefCounted";
+        if (itr->second_->IsObject())
+        {
+            classname = ((Object*) itr->second_)->GetTypeName();
+        }
+
+        if (classname == "JSComponent")
+        {
+            JSComponent* jsc = (JSComponent*) itr->second_;
+            const String& classname = jsc->GetClassName();
+            if (!jscomponents.Contains(classname))
+            {
+                jsnames.Push(classname);
+                jscomponents[classname] = 1;
+            }
+            else
+                jscomponents[classname]++;
+        }
+
+        itr++;
+    }
+
+    for (unsigned i = 0; i < jsnames.Size(); i++)
+    {
+        const String& classname = jsnames[i];
+        LOGINFOF("%s %i", classname.CString(), jscomponents[classname]);
+    }
+
+}
+
 void JSMetrics::Capture()
 void JSMetrics::Capture()
 {
 {
     objectMetrics_.Clear();
     objectMetrics_.Clear();
 
 
+    // run twice to call finalizers
+    // see duktape docs
+    duk_gc(vm_->GetJSContext(), 0);
+    duk_gc(vm_->GetJSContext(), 0);
+
+
     HashMap<void*, RefCounted*>::ConstIterator itr = vm_->heapToObject_.Begin();
     HashMap<void*, RefCounted*>::ConstIterator itr = vm_->heapToObject_.Begin();
     while (itr != vm_->heapToObject_.End())
     while (itr != vm_->heapToObject_.End())
     {
     {

+ 2 - 0
Source/AtomicJS/Javascript/JSMetrics.h

@@ -31,7 +31,9 @@ public:
     virtual ~JSMetrics();
     virtual ~JSMetrics();
 
 
     void Capture();
     void Capture();
+
     void Dump();
     void Dump();
+    void DumpJSComponents();
 
 
 private:
 private: