ProfileNode* ProfileNode::traverseNextNodePostOrder() const { ProfileNode* next = m_nextSibling; if (!next) return m_parent; while (ProfileNode* firstChild = next->firstChild()) next = firstChild; return next; }
// 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); }
// 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); }
void Profile::forEach(void (ProfileNode::*function)()) { ProfileNode* currentNode = m_head->firstChild(); for (ProfileNode* nextNode = currentNode; nextNode; nextNode = nextNode->firstChild()) currentNode = nextNode; if (!currentNode) currentNode = m_head.get(); ProfileNode* endNode = m_head->traverseNextNodePostOrder(); while (currentNode && currentNode != endNode) { (currentNode->*function)(); currentNode = currentNode->traverseNextNodePostOrder(); } }