|
|
@@ -2,6 +2,7 @@
|
|
|
#include <Atomic/Container/Sort.h>
|
|
|
|
|
|
#include "JSVM.h"
|
|
|
+#include "JSComponent.h"
|
|
|
#include "JSMetrics.h"
|
|
|
|
|
|
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()
|
|
|
{
|
|
|
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();
|
|
|
while (itr != vm_->heapToObject_.End())
|
|
|
{
|