18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2008 Apple Inc. All rights reserved. 38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without 58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions 68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met: 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer. 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * documentation and/or other materials provided with the distribution. 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * its contributors may be used to endorse or promote products derived 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * from this software without specific prior written permission. 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef ProfileNode_h 308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define ProfileNode_h 318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CallIdentifier.h" 33f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick#include <wtf/HashCountedSet.h> 348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/RefCounted.h> 358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/RefPtr.h> 36f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick#include <wtf/Vector.h> 378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace JSC { 398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 404576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang class ExecState; 418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project class ProfileNode; 428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project typedef Vector<RefPtr<ProfileNode> >::const_iterator StackIterator; 44f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick typedef HashCountedSet<StringImpl*> FunctionCallHashCount; 458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project class ProfileNode : public RefCounted<ProfileNode> { 478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project public: 484576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang static PassRefPtr<ProfileNode> create(ExecState* callerCallFrame, const CallIdentifier& callIdentifier, ProfileNode* headNode, ProfileNode* parentNode) 498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 504576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return adoptRef(new ProfileNode(callerCallFrame, callIdentifier, headNode, parentNode)); 518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 524576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang static PassRefPtr<ProfileNode> create(ExecState* callerCallFrame, ProfileNode* headNode, ProfileNode* node) 538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 544576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return adoptRef(new ProfileNode(callerCallFrame, headNode, node)); 558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool operator==(ProfileNode* node) { return m_callIdentifier == node->callIdentifier(); } 588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 594576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ProfileNode* willExecute(ExecState* callerCallFrame, const CallIdentifier&); 608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ProfileNode* didExecute(); 618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void stopProfiling(); 638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // CallIdentifier members 654576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ExecState* callerCallFrame() const { return m_callerCallFrame; } 668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const CallIdentifier& callIdentifier() const { return m_callIdentifier; } 678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const UString& functionName() const { return m_callIdentifier.m_name; } 688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const UString& url() const { return m_callIdentifier.m_url; } 698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned lineNumber() const { return m_callIdentifier.m_lineNumber; } 708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Relationships 728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ProfileNode* head() const { return m_head; } 738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void setHead(ProfileNode* head) { m_head = head; } 748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ProfileNode* parent() const { return m_parent; } 758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void setParent(ProfileNode* parent) { m_parent = parent; } 768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ProfileNode* nextSibling() const { return m_nextSibling; } 778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void setNextSibling(ProfileNode* nextSibling) { m_nextSibling = nextSibling; } 788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Time members 808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project double startTime() const { return m_startTime; } 818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void setStartTime(double startTime) { m_startTime = startTime; } 828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project double totalTime() const { return m_visibleTotalTime; } 838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project double actualTotalTime() const { return m_actualTotalTime; } 848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void setTotalTime(double time) { m_actualTotalTime = time; m_visibleTotalTime = time; } 858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void setActualTotalTime(double time) { m_actualTotalTime = time; } 868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void setVisibleTotalTime(double time) { m_visibleTotalTime = time; } 878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project double selfTime() const { return m_visibleSelfTime; } 888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project double actualSelfTime() const { return m_actualSelfTime; } 898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void setSelfTime(double time) {m_actualSelfTime = time; m_visibleSelfTime = time; } 908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void setActualSelfTime(double time) { m_actualSelfTime = time; } 918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void setVisibleSelfTime(double time) { m_visibleSelfTime = time; } 928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project double totalPercent() const { return (m_visibleTotalTime / (m_head ? m_head->totalTime() : totalTime())) * 100.0; } 948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project double selfPercent() const { return (m_visibleSelfTime / (m_head ? m_head->totalTime() : totalTime())) * 100.0; } 958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned numberOfCalls() const { return m_numberOfCalls; } 978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void setNumberOfCalls(unsigned number) { m_numberOfCalls = number; } 988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Children members 1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const Vector<RefPtr<ProfileNode> >& children() const { return m_children; } 1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ProfileNode* firstChild() const { return m_children.size() ? m_children.first().get() : 0; } 1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ProfileNode* lastChild() const { return m_children.size() ? m_children.last().get() : 0; } 1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ProfileNode* findChild(ProfileNode*) const; 1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void removeChild(ProfileNode*); 1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void addChild(PassRefPtr<ProfileNode> prpChild); 1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void insertNode(PassRefPtr<ProfileNode> prpNode); 1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Visiblity 1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool visible() const { return m_visible; } 1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void setVisible(bool visible) { m_visible = visible; } 1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project static void setTreeVisible(ProfileNode*, bool visible); 1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Sorting 1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ProfileNode* traverseNextNodePostOrder() const; 1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ProfileNode* traverseNextNodePreOrder(bool processChildren = true) const; 1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Views 1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void calculateVisibleTotalTime(); 1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool focus(const CallIdentifier&); 1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void exclude(const CallIdentifier&); 1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void restore(); 1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void endAndRecordCall(); 1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef NDEBUG 1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const char* c_str() const { return m_callIdentifier; } 1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void debugPrintData(int indentLevel) const; 1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project double debugPrintDataSampleStyle(int indentLevel, FunctionCallHashCount&) const; 1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project private: 1334576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ProfileNode(ExecState* callerCallFrame, const CallIdentifier&, ProfileNode* headNode, ProfileNode* parentNode); 1344576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ProfileNode(ExecState* callerCallFrame, ProfileNode* headNode, ProfileNode* nodeToCopy); 1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void startTimer(); 1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void resetChildrensSiblings(); 1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<ProfileNode>* childrenBegin() { return m_children.begin(); } 1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<ProfileNode>* childrenEnd() { return m_children.end(); } 1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Sorting comparators 1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project static inline bool totalTimeDescendingComparator(const RefPtr<ProfileNode>& a, const RefPtr<ProfileNode>& b) { return a->totalTime() > b->totalTime(); } 1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project static inline bool totalTimeAscendingComparator(const RefPtr<ProfileNode>& a, const RefPtr<ProfileNode>& b) { return a->totalTime() < b->totalTime(); } 1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project static inline bool selfTimeDescendingComparator(const RefPtr<ProfileNode>& a, const RefPtr<ProfileNode>& b) { return a->selfTime() > b->selfTime(); } 1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project static inline bool selfTimeAscendingComparator(const RefPtr<ProfileNode>& a, const RefPtr<ProfileNode>& b) { return a->selfTime() < b->selfTime(); } 1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project static inline bool callsDescendingComparator(const RefPtr<ProfileNode>& a, const RefPtr<ProfileNode>& b) { return a->numberOfCalls() > b->numberOfCalls(); } 1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project static inline bool callsAscendingComparator(const RefPtr<ProfileNode>& a, const RefPtr<ProfileNode>& b) { return a->numberOfCalls() < b->numberOfCalls(); } 1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project static inline bool functionNameDescendingComparator(const RefPtr<ProfileNode>& a, const RefPtr<ProfileNode>& b) { return a->functionName() > b->functionName(); } 1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project static inline bool functionNameAscendingComparator(const RefPtr<ProfileNode>& a, const RefPtr<ProfileNode>& b) { return a->functionName() < b->functionName(); } 1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1524576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ExecState* m_callerCallFrame; 1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CallIdentifier m_callIdentifier; 1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ProfileNode* m_head; 1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ProfileNode* m_parent; 1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ProfileNode* m_nextSibling; 1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project double m_startTime; 1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project double m_actualTotalTime; 1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project double m_visibleTotalTime; 1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project double m_actualSelfTime; 1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project double m_visibleSelfTime; 1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned m_numberOfCalls; 1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool m_visible; 1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Vector<RefPtr<ProfileNode> > m_children; 1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project }; 1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace JSC 1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif // ProfileNode_h 173