// The console.profileEnd that stopped this ProfileGenerator will be the last child. void ProfileGenerator::removeProfileEnd() { ProfileNode* currentNode = nullptr; for (ProfileNode* next = m_rootNode.get(); next; next = next->lastChild()) currentNode = next; if (currentNode->callIdentifier().functionName() != "profileEnd") return; ASSERT(currentNode->callIdentifier() == (currentNode->parent()->children()[currentNode->parent()->children().size() - 1])->callIdentifier()); currentNode->parent()->removeChild(currentNode); }
// The console.ProfileGenerator that started this ProfileGenerator will be the first child. void ProfileGenerator::removeProfileStart() { ProfileNode* currentNode = 0; for (ProfileNode* next = m_head.get(); next; next = next->firstChild()) currentNode = next; if (currentNode->callIdentifier().m_name != "profile") return; // Attribute the time of the node aobut to be removed to the self time of its parent currentNode->parent()->setSelfTime(currentNode->parent()->selfTime() + currentNode->totalTime()); currentNode->parent()->removeChild(currentNode); }
// The console.profileEnd that stopped this ProfileGenerator will be the last child. void ProfileGenerator::removeProfileEnd() { ProfileNode* currentNode = 0; for (ProfileNode* next = m_head.get(); next; next = next->lastChild()) currentNode = next; if (currentNode->callIdentifier().functionName() != "profileEnd") return; // Attribute the time of the node aobut to be removed to the self time of its parent currentNode->parent()->setSelfTime(currentNode->parent()->selfTime() + currentNode->totalTime()); ASSERT(currentNode->callIdentifier() == (currentNode->parent()->children()[currentNode->parent()->children().size() - 1])->callIdentifier()); currentNode->parent()->removeChild(currentNode); }
// The console.profile that started this ProfileGenerator will be the first child. void ProfileGenerator::removeProfileStart() { ProfileNode* currentNode = nullptr; for (ProfileNode* next = m_rootNode.get(); next; next = next->firstChild()) currentNode = next; if (currentNode->callIdentifier().functionName() != "profile") return; currentNode->parent()->removeChild(currentNode); }
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; }
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 ProfileGenerator::stopProfiling() { for (ProfileNode* node = m_currentNode.get(); node != m_profile->rootNode(); node = node->parent()) endCallEntry(node); if (m_foundConsoleStartParent) { removeProfileStart(); removeProfileEnd(); } ASSERT(m_currentNode); // Set the current node to the parent, because we are in a call that // will not get didExecute call. m_currentNode = m_currentNode->parent(); }