Remove dead code from the JSC profiler.
authortimothy@apple.com <timothy@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 26 Jan 2014 06:30:38 +0000 (06:30 +0000)
committertimothy@apple.com <timothy@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 26 Jan 2014 06:30:38 +0000 (06:30 +0000)
https://bugs.webkit.org/show_bug.cgi?id=127643

Reviewed by Mark Lam.

Source/JavaScriptCore:

* profiler/Profile.cpp:
* profiler/Profile.h:
* profiler/ProfileGenerator.cpp:
(JSC::ProfileGenerator::stopProfiling):
* profiler/ProfileNode.cpp:
(JSC::ProfileNode::ProfileNode):
(JSC::ProfileNode::stopProfiling):
(JSC::ProfileNode::endAndRecordCall):
(JSC::ProfileNode::debugPrintData):
(JSC::ProfileNode::debugPrintDataSampleStyle):
* profiler/ProfileNode.h:
(JSC::ProfileNode::totalTime):
(JSC::ProfileNode::setTotalTime):
(JSC::ProfileNode::selfTime):
(JSC::ProfileNode::setSelfTime):
(JSC::ProfileNode::totalPercent):
(JSC::ProfileNode::selfPercent):
Remove support for things like focus and exclude. The Inspector does those in JS now.

Source/WebCore:

Passes existing tests in fast/profiler.

* bindings/js/ScriptProfile.cpp:
(WebCore::buildInspectorObjectFor): Remove visible.
* inspector/ScriptProfileNode.idl: Ditto.
* inspector/protocol/Profiler.json: Ditto.

Source/WebInspectorUI:

* Versions/Inspector-iOS-7.0.json: Remove visible from CPUProfileNode.

LayoutTests:

* fast/profiler/resources/profiler-test-JS-resources.js:
(printProfileNodeWithoutTime): Don't use visible. It was always true.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@162796 268f45cc-cd09-0410-ab3c-d52691b4dbfc

14 files changed:
LayoutTests/ChangeLog
LayoutTests/fast/profiler/resources/profiler-test-JS-resources.js
Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/profiler/Profile.cpp
Source/JavaScriptCore/profiler/Profile.h
Source/JavaScriptCore/profiler/ProfileGenerator.cpp
Source/JavaScriptCore/profiler/ProfileNode.cpp
Source/JavaScriptCore/profiler/ProfileNode.h
Source/WebCore/ChangeLog
Source/WebCore/bindings/js/ScriptProfile.cpp
Source/WebCore/inspector/ScriptProfileNode.idl
Source/WebCore/inspector/protocol/Profiler.json
Source/WebInspectorUI/ChangeLog
Source/WebInspectorUI/Versions/Inspector-iOS-7.0.json

index e0538e0..bc339f1 100644 (file)
@@ -1,3 +1,14 @@
+2014-01-25  Timothy Hatcher  <timothy@apple.com>
+
+        Remove dead code from the JSC profiler.
+
+        https://bugs.webkit.org/show_bug.cgi?id=127643
+
+        Reviewed by Mark Lam.
+
+        * fast/profiler/resources/profiler-test-JS-resources.js:
+        (printProfileNodeWithoutTime): Don't use visible. It was always true.
+
 2014-01-25  Zalan Bujtas  <zalan@apple.com>
 
         Subpixel layout: RenderInline is not centered when child RenderTextControl's innerTextRenderer needs bias centering.
index 93913f1..f4599c0 100644 (file)
@@ -79,9 +79,6 @@ function printProfileNodeWithoutTime(preElement, node, indentLevel)
     if (node.functionName == "(idle)")
         return;
 
-    if (!node.visible)
-        return;
-
     var space = "";
     for (var i = 0; i < indentLevel; ++i)
         space += "   "
index b701920..38ba1e3 100644 (file)
@@ -1,3 +1,30 @@
+2014-01-25  Timothy Hatcher  <timothy@apple.com>
+
+        Remove dead code from the JSC profiler.
+
+        https://bugs.webkit.org/show_bug.cgi?id=127643
+
+        Reviewed by Mark Lam.
+
+        * profiler/Profile.cpp:
+        * profiler/Profile.h:
+        * profiler/ProfileGenerator.cpp:
+        (JSC::ProfileGenerator::stopProfiling):
+        * profiler/ProfileNode.cpp:
+        (JSC::ProfileNode::ProfileNode):
+        (JSC::ProfileNode::stopProfiling):
+        (JSC::ProfileNode::endAndRecordCall):
+        (JSC::ProfileNode::debugPrintData):
+        (JSC::ProfileNode::debugPrintDataSampleStyle):
+        * profiler/ProfileNode.h:
+        (JSC::ProfileNode::totalTime):
+        (JSC::ProfileNode::setTotalTime):
+        (JSC::ProfileNode::selfTime):
+        (JSC::ProfileNode::setSelfTime):
+        (JSC::ProfileNode::totalPercent):
+        (JSC::ProfileNode::selfPercent):
+        Remove support for things like focus and exclude. The Inspector does those in JS now.
+
 2014-01-25  Sam Weinig  <sam@webkit.org>
 
         Remove unused support for DRAGGABLE_REGION
index c3a7600..ed21e78 100644 (file)
@@ -65,40 +65,6 @@ void Profile::forEach(void (ProfileNode::*function)())
     } 
 }
 
-void Profile::focus(const ProfileNode* profileNode)
-{
-    if (!profileNode || !m_head)
-        return;
-
-    bool processChildren;
-    const CallIdentifier& callIdentifier = profileNode->callIdentifier();
-    for (ProfileNode* currentNode = m_head.get(); currentNode; currentNode = currentNode->traverseNextNodePreOrder(processChildren))
-        processChildren = currentNode->focus(callIdentifier);
-
-    // Set the visible time of all nodes so that the %s display correctly.
-    forEach(&ProfileNode::calculateVisibleTotalTime);
-}
-
-void Profile::exclude(const ProfileNode* profileNode)
-{
-    if (!profileNode || !m_head)
-        return;
-
-    const CallIdentifier& callIdentifier = profileNode->callIdentifier();
-
-    for (ProfileNode* currentNode = m_head.get(); currentNode; currentNode = currentNode->traverseNextNodePreOrder())
-        currentNode->exclude(callIdentifier);
-
-    // Set the visible time of the head so the %s display correctly.
-    m_head->setVisibleTotalTime(m_head->totalTime() - m_head->selfTime());
-    m_head->setVisibleSelfTime(0.0);
-}
-
-void Profile::restoreAll()
-{
-    forEach(&ProfileNode::restore);
-}
-
 #ifndef NDEBUG
 void Profile::debugPrintData() const
 {
index c1c6919..b1f093d 100644 (file)
@@ -44,11 +44,7 @@ namespace JSC {
         double totalTime() const { return m_head->totalTime(); }
         unsigned int uid() const { return m_uid; }
 
-        JS_EXPORT_PRIVATE void forEach(void (ProfileNode::*)());
-
-        JS_EXPORT_PRIVATE void focus(const ProfileNode*);
-        JS_EXPORT_PRIVATE void exclude(const ProfileNode*);
-        JS_EXPORT_PRIVATE void restoreAll();
+        void forEach(void (ProfileNode::*)());
 
 #ifndef NDEBUG
         void debugPrintData() const;
index ca90a14..9361caf 100644 (file)
@@ -178,14 +178,13 @@ void ProfileGenerator::stopProfiling()
 
         idleNode->setTotalTime(headSelfTime);
         idleNode->setSelfTime(headSelfTime);
-        idleNode->setVisible(true);
 
         m_head->setSelfTime(0.0);
         m_head->addChild(idleNode.release());
     }
 }
 
-// The console.ProfileGenerator that started this ProfileGenerator will be the first child.
+// The console.profile that started this ProfileGenerator will be the first child.
 void ProfileGenerator::removeProfileStart()
 {
     ProfileNode* currentNode = 0;
@@ -200,7 +199,7 @@ void ProfileGenerator::removeProfileStart()
     currentNode->parent()->removeChild(currentNode);
 }
 
-// The console.ProfileGeneratorEnd that stopped this ProfileGenerator will be the last child.
+// The console.profileEnd that stopped this ProfileGenerator will be the last child.
 void ProfileGenerator::removeProfileEnd()
 {
     ProfileNode* currentNode = 0;
index 45e9839..f1d6927 100644 (file)
@@ -63,12 +63,9 @@ ProfileNode::ProfileNode(ExecState* callerCallFrame, const CallIdentifier& callI
     , m_parent(parentNode)
     , m_nextSibling(0)
     , m_startTime(0.0)
-    , m_actualTotalTime(0.0)
-    , m_visibleTotalTime(0.0)
-    , m_actualSelfTime(0.0)
-    , m_visibleSelfTime(0.0)
+    , m_totalTime(0.0)
+    , m_selfTime(0.0)
     , m_numberOfCalls(0)
-    , m_visible(true)
 {
     startTimer();
 }
@@ -80,12 +77,9 @@ ProfileNode::ProfileNode(ExecState* callerCallFrame, ProfileNode* headNode, Prof
     , m_parent(nodeToCopy->parent())
     , m_nextSibling(0)
     , m_startTime(0.0)
-    , m_actualTotalTime(nodeToCopy->actualTotalTime())
-    , m_visibleTotalTime(nodeToCopy->totalTime())
-    , m_actualSelfTime(nodeToCopy->actualSelfTime())
-    , m_visibleSelfTime(nodeToCopy->selfTime())
+    , m_totalTime(nodeToCopy->totalTime())
+    , m_selfTime(nodeToCopy->selfTime())
     , m_numberOfCalls(nodeToCopy->numberOfCalls())
-    , m_visible(nodeToCopy->visible())
 {
 }
 
@@ -120,19 +114,6 @@ void ProfileNode::addChild(PassRefPtr<ProfileNode> prpChild)
     m_children.append(child.release());
 }
 
-ProfileNode* ProfileNode::findChild(ProfileNode* node) const
-{
-    if (!node)
-        return 0;
-
-    for (size_t i = 0; i < m_children.size(); ++i) {
-        if (*node == m_children[i].get())
-            return m_children[i].get();
-    }
-
-    return 0;
-}
-
 void ProfileNode::removeChild(ProfileNode* node)
 {
     if (!node)
@@ -164,17 +145,14 @@ void ProfileNode::stopProfiling()
     if (m_startTime)
         endAndRecordCall();
 
-    m_visibleTotalTime = m_actualTotalTime;
-
-    ASSERT(m_actualSelfTime == 0.0 && m_startTime == 0.0);
+    ASSERT(m_selfTime == 0.0 && m_startTime == 0.0);
 
     // Because we iterate in post order all of our children have been stopped before us.
     for (unsigned i = 0; i < m_children.size(); ++i)
-        m_actualSelfTime += m_children[i]->totalTime();
+        m_selfTime += m_children[i]->totalTime();
 
-    ASSERT(m_actualSelfTime <= m_actualTotalTime);
-    m_actualSelfTime = m_actualTotalTime - m_actualSelfTime;
-    m_visibleSelfTime = m_actualSelfTime;
+    ASSERT(m_selfTime <= m_totalTime);
+    m_selfTime = m_totalTime - m_selfTime;
 }
 
 ProfileNode* ProfileNode::traverseNextNodePostOrder() const
@@ -187,89 +165,9 @@ ProfileNode* ProfileNode::traverseNextNodePostOrder() const
     return next;
 }
 
-ProfileNode* ProfileNode::traverseNextNodePreOrder(bool processChildren) const
-{
-    if (processChildren && m_children.size())
-        return m_children[0].get();
-
-    if (m_nextSibling)
-        return m_nextSibling;
-
-    ProfileNode* nextParent = m_parent;
-    if (!nextParent)
-        return 0;
-
-    ProfileNode* next;
-    for (next = m_parent->nextSibling(); !next; next = nextParent->nextSibling()) {
-        nextParent = nextParent->parent();
-        if (!nextParent)
-            return 0;
-    }
-
-    return next;
-}
-
-void ProfileNode::setTreeVisible(ProfileNode* node, bool visible)
-{
-    ProfileNode* nodeParent = node->parent();
-    ProfileNode* nodeSibling = node->nextSibling();
-    node->setParent(0);
-    node->setNextSibling(0);
-
-    for (ProfileNode* currentNode = node; currentNode; currentNode = currentNode->traverseNextNodePreOrder())
-        currentNode->setVisible(visible);
-
-    node->setParent(nodeParent);
-    node->setNextSibling(nodeSibling);
-}
-
-void ProfileNode::calculateVisibleTotalTime()
-{
-    double sumOfVisibleChildrensTime = 0.0;
-
-    for (unsigned i = 0; i < m_children.size(); ++i) {
-        if (m_children[i]->visible())
-            sumOfVisibleChildrensTime += m_children[i]->totalTime();
-    }
-
-    m_visibleTotalTime = m_visibleSelfTime + sumOfVisibleChildrensTime;
-}
-
-bool ProfileNode::focus(const CallIdentifier& callIdentifier)
-{
-    if (!m_visible)
-        return false;
-
-    if (m_callIdentifier != callIdentifier) {
-        m_visible = false;
-        return true;
-    }
-
-    for (ProfileNode* currentParent = m_parent; currentParent; currentParent = currentParent->parent())
-        currentParent->setVisible(true);
-
-    return false;
-}
-
-void ProfileNode::exclude(const CallIdentifier& callIdentifier)
-{
-    if (m_visible && m_callIdentifier == callIdentifier) {
-        setTreeVisible(this, false);
-
-        m_parent->setVisibleSelfTime(m_parent->selfTime() + m_visibleTotalTime);
-    }
-}
-
-void ProfileNode::restore()
-{
-    m_visibleTotalTime = m_actualTotalTime;
-    m_visibleSelfTime = m_actualSelfTime;
-    m_visible = true;
-}
-
 void ProfileNode::endAndRecordCall()
 {
-    m_actualTotalTime += m_startTime ? getCount() - m_startTime : 0.0;
+    m_totalTime += m_startTime ? getCount() - m_startTime : 0.0;
     m_startTime = 0.0;
 
     ++m_numberOfCalls;
@@ -297,7 +195,7 @@ void ProfileNode::debugPrintData(int indentLevel) const
 
     dataLogF("Function Name %s %d SelfTime %.3fms/%.3f%% TotalTime %.3fms/%.3f%% VSelf %.3fms VTotal %.3fms Visible %s Next Sibling %s\n",
         functionName().utf8().data(), 
-        m_numberOfCalls, m_actualSelfTime, selfPercent(), m_actualTotalTime, totalPercent(),
+        m_numberOfCalls, m_selfTime, selfPercent(), m_totalTime, totalPercent(),
         m_visibleSelfTime, m_visibleTotalTime, 
         (m_visible ? "True" : "False"),
         m_nextSibling ? m_nextSibling->functionName().utf8().data() : "");
@@ -316,7 +214,7 @@ double ProfileNode::debugPrintDataSampleStyle(int indentLevel, FunctionCallHashC
 
     // Print function names
     const char* name = functionName().utf8().data();
-    double sampleCount = m_actualTotalTime * 1000;
+    double sampleCount = m_totalTime * 1000;
     if (indentLevel) {
         for (int i = 0; i < indentLevel; ++i)
             dataLogF("  ");
@@ -344,7 +242,7 @@ double ProfileNode::debugPrintDataSampleStyle(int indentLevel, FunctionCallHashC
         dataLogF("%.0f %s\n", sampleCount - sumOfChildrensCount, functionName().utf8().data());
     }
 
-    return m_actualTotalTime;
+    return m_totalTime;
 }
 #endif
 
index 14797df..e21b422 100644 (file)
@@ -48,6 +48,7 @@ namespace JSC {
         {
             return adoptRef(new ProfileNode(callerCallFrame, callIdentifier, headNode, parentNode));
         }
+
         static PassRefPtr<ProfileNode> create(ExecState* callerCallFrame, ProfileNode* headNode, ProfileNode* node)
         {
             return adoptRef(new ProfileNode(callerCallFrame, headNode, node));
@@ -71,55 +72,37 @@ namespace JSC {
         // Relationships
         ProfileNode* head() const { return m_head; }
         void setHead(ProfileNode* head) { m_head = head; }
+
         ProfileNode* parent() const { return m_parent; }
         void setParent(ProfileNode* parent) { m_parent = parent; }
+
         ProfileNode* nextSibling() const { return m_nextSibling; }
         void setNextSibling(ProfileNode* nextSibling) { m_nextSibling = nextSibling; }
 
         // Time members
         double startTime() const { return m_startTime; }
         void setStartTime(double startTime) { m_startTime = startTime; }
-        double totalTime() const { return m_visibleTotalTime; }
-        double actualTotalTime() const { return m_actualTotalTime; }
-        void setTotalTime(double time) { m_actualTotalTime = time; m_visibleTotalTime = time; }
-        void setActualTotalTime(double time) { m_actualTotalTime = time; }
-        void setVisibleTotalTime(double time) { m_visibleTotalTime = time; }
-        double selfTime() const { return m_visibleSelfTime; }
-        double actualSelfTime() const { return m_actualSelfTime; }
-        void setSelfTime(double time) {m_actualSelfTime = time; m_visibleSelfTime = time; }
-        void setActualSelfTime(double time) { m_actualSelfTime = time; }
-        void setVisibleSelfTime(double time) { m_visibleSelfTime = time; }
-
-        double totalPercent() const { return (m_visibleTotalTime / (m_head ? m_head->totalTime() : totalTime())) * 100.0; }
-        double selfPercent() const { return (m_visibleSelfTime / (m_head ? m_head->totalTime() : totalTime())) * 100.0; }
+
+        double totalTime() const { return m_totalTime; }
+        void setTotalTime(double time) { m_totalTime = time; }
+
+        double selfTime() const { return m_selfTime; }
+        void setSelfTime(double time) { m_selfTime = time; }
+
+        double totalPercent() const { return (m_totalTime / (m_head ? m_head->totalTime() : totalTime())) * 100.0; }
+        double selfPercent() const { return (m_selfTime / (m_head ? m_head->totalTime() : totalTime())) * 100.0; }
 
         unsigned numberOfCalls() const { return m_numberOfCalls; }
-        void setNumberOfCalls(unsigned number) { m_numberOfCalls = number; }
 
         // Children members
         const Vector<RefPtr<ProfileNode>>& children() const { return m_children; }
         ProfileNode* firstChild() const { return m_children.size() ? m_children.first().get() : 0; }
         ProfileNode* lastChild() const { return m_children.size() ? m_children.last().get() : 0; }
-        ProfileNode* findChild(ProfileNode*) const;
         void removeChild(ProfileNode*);
         void addChild(PassRefPtr<ProfileNode> prpChild);
         void insertNode(PassRefPtr<ProfileNode> prpNode);
 
-        // Visiblity
-        bool visible() const { return m_visible; }
-        void setVisible(bool visible) { m_visible = visible; }
-
-        static void setTreeVisible(ProfileNode*, bool visible);
-
-        // Sorting
         ProfileNode* traverseNextNodePostOrder() const;
-        ProfileNode* traverseNextNodePreOrder(bool processChildren = true) const;
-
-        // Views
-        void calculateVisibleTotalTime();
-        bool focus(const CallIdentifier&);
-        void exclude(const CallIdentifier&);
-        void restore();
 
         void endAndRecordCall();
 
@@ -138,19 +121,6 @@ namespace JSC {
         void startTimer();
         void resetChildrensSiblings();
 
-        RefPtr<ProfileNode>* childrenBegin() { return m_children.begin(); }
-        RefPtr<ProfileNode>* childrenEnd() { return m_children.end(); }
-
-        // Sorting comparators
-        static inline bool totalTimeDescendingComparator(const RefPtr<ProfileNode>& a, const RefPtr<ProfileNode>& b) { return a->totalTime() > b->totalTime(); }
-        static inline bool totalTimeAscendingComparator(const RefPtr<ProfileNode>& a, const RefPtr<ProfileNode>& b) { return a->totalTime() < b->totalTime(); }
-        static inline bool selfTimeDescendingComparator(const RefPtr<ProfileNode>& a, const RefPtr<ProfileNode>& b) { return a->selfTime() > b->selfTime(); }
-        static inline bool selfTimeAscendingComparator(const RefPtr<ProfileNode>& a, const RefPtr<ProfileNode>& b) { return a->selfTime() < b->selfTime(); }
-        static inline bool callsDescendingComparator(const RefPtr<ProfileNode>& a, const RefPtr<ProfileNode>& b) { return a->numberOfCalls() > b->numberOfCalls(); }
-        static inline bool callsAscendingComparator(const RefPtr<ProfileNode>& a, const RefPtr<ProfileNode>& b) { return a->numberOfCalls() < b->numberOfCalls(); }
-        static inline bool functionNameDescendingComparator(const RefPtr<ProfileNode>& a, const RefPtr<ProfileNode>& b) { return codePointCompareLessThan(b->functionName(), a->functionName()); }
-        static inline bool functionNameAscendingComparator(const RefPtr<ProfileNode>& a, const RefPtr<ProfileNode>& b) { return codePointCompareLessThan(a->functionName(), b->functionName()); }
-
         ExecState* m_callerCallFrame;
         CallIdentifier m_callIdentifier;
         ProfileNode* m_head;
@@ -158,14 +128,10 @@ namespace JSC {
         ProfileNode* m_nextSibling;
 
         double m_startTime;
-        double m_actualTotalTime;
-        double m_visibleTotalTime;
-        double m_actualSelfTime;
-        double m_visibleSelfTime;
+        double m_totalTime;
+        double m_selfTime;
         unsigned m_numberOfCalls;
 
-        bool m_visible;
-
         Vector<RefPtr<ProfileNode>> m_children;
     };
 
index c2cd41c..8be8d19 100644 (file)
@@ -1,3 +1,18 @@
+2014-01-25  Timothy Hatcher  <timothy@apple.com>
+
+        Remove dead code from the JSC profiler.
+
+        https://bugs.webkit.org/show_bug.cgi?id=127643
+
+        Reviewed by Mark Lam.
+
+        Passes existing tests in fast/profiler.
+
+        * bindings/js/ScriptProfile.cpp:
+        (WebCore::buildInspectorObjectFor): Remove visible.
+        * inspector/ScriptProfileNode.idl: Ditto.
+        * inspector/protocol/Profiler.json: Ditto.
+
 2014-01-25  Sam Weinig  <sam@webkit.org>
 
         Remove unused support for DRAGGABLE_REGION
index 2124490..3e4e63b 100644 (file)
@@ -90,7 +90,6 @@ static PassRefPtr<Inspector::TypeBuilder::Profiler::CPUProfileNode> buildInspect
         .setTotalTime(node->totalTime())
         .setSelfTime(node->selfTime())
         .setNumberOfCalls(node->numberOfCalls())
-        .setVisible(node->visible())
         .setCallUID(node->callIdentifier().hash())
         .setChildren(children.release());
     return result.release();
index df6cc70..022b1ba 100644 (file)
@@ -36,7 +36,6 @@
     readonly attribute double selfTime;
     readonly attribute unsigned long numberOfCalls;
     sequence<ScriptProfileNode> children();
-    readonly attribute boolean visible;
     readonly attribute unsigned long callUID;
 };
 
index ecb848a..791d50a 100644 (file)
@@ -23,7 +23,6 @@
                 { "name": "totalTime", "type": "number", "description": "Total execution time." },
                 { "name": "selfTime", "type": "number", "description": "Self time." },
                 { "name": "numberOfCalls", "type": "integer", "description": "Number of calls." },
-                { "name": "visible", "type": "boolean", "description": "Visibility." },
                 { "name": "callUID", "type": "number", "description": "Call UID." },
                 { "name": "children", "type": "array", "items": { "$ref": "CPUProfileNode" }, "description": "Child nodes." },
                 { "name": "id", "optional": true, "type": "integer", "description": "Unique id of the node." }
index cba91f3..684b6db 100644 (file)
@@ -1,3 +1,13 @@
+2014-01-25  Timothy Hatcher  <timothy@apple.com>
+
+        Remove dead code from the JSC profiler.
+
+        https://bugs.webkit.org/show_bug.cgi?id=127643
+
+        Reviewed by Mark Lam.
+
+        * Versions/Inspector-iOS-7.0.json: Remove visible from CPUProfileNode.
+
 2014-01-25  Joseph Pecoraro  <pecoraro@apple.com>
 
         Remove FIXME in CSSKeywordCompletions.js about "inherit" keyword
index 1c7e99b..c5866a3 100644 (file)
                     { "name": "totalTime", "type": "number", "description": "Total execution time." },
                     { "name": "selfTime", "type": "number", "description": "Self time." },
                     { "name": "numberOfCalls", "type": "integer", "description": "Number of calls." },
-                    { "name": "visible", "type": "boolean", "description": "Visibility." },
                     { "name": "callUID", "type": "number", "description": "Call UID." },
                     { "name": "children", "type": "array", "items": { "$ref": "CPUProfileNode" }, "description": "Child nodes." },
                     { "name": "id", "optional": true, "type": "integer", "description": "Unique id of the node." }