Use member function pointers for the Profile::forEach function.
[WebKit-https.git] / JavaScriptCore / profiler / Profile.h
1 /*
2  * Copyright (C) 2008 Apple Inc. All Rights Reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25  
26 #ifndef Profile_h
27 #define Profile_h
28
29 #include "ProfileNode.h"
30 #include <wtf/RefCounted.h>
31 #include <wtf/RefPtr.h>
32
33 namespace KJS {
34
35     class ExecState;
36     class ProfilerClient;
37
38     class Profile : public RefCounted<Profile> {
39     public:
40         static PassRefPtr<Profile> create(const UString& title, ExecState* originatingGlobalExec, unsigned pageGroupIdentifier, ProfilerClient*);
41
42         void willExecute(const CallIdentifier&);
43         void didExecute(const CallIdentifier&);
44         void stopProfiling();
45         bool didFinishAllExecution();
46
47         const UString& title() const { return m_title; };
48         ProfileNode* callTree() const { return m_head.get(); };
49
50         double totalTime() const { return m_head->totalTime(); }
51
52         ExecState* originatingGlobalExec() const { return m_originatingGlobalExec; }
53         unsigned pageGroupIdentifier() const { return m_pageGroupIdentifier; }
54         ProfilerClient* client() { return m_client; }
55
56         void forEach(void (ProfileNode::*)());
57         void sortTotalTimeDescending() { forEach(&ProfileNode::sortTotalTimeDescending); }
58         void sortTotalTimeAscending() { forEach(&ProfileNode::sortTotalTimeAscending); }
59         void sortSelfTimeDescending() { forEach(&ProfileNode::sortSelfTimeDescending); }
60         void sortSelfTimeAscending() { forEach(&ProfileNode::sortSelfTimeAscending); }
61         void sortCallsDescending() { forEach(&ProfileNode::sortCallsDescending); }
62         void sortCallsAscending() { forEach(&ProfileNode::sortCallsAscending); }
63         void sortFunctionNameDescending() { forEach(&ProfileNode::sortFunctionNameDescending); }
64         void sortFunctionNameAscending() { forEach(&ProfileNode::sortFunctionNameAscending); }
65
66         void focus(const ProfileNode* profileNode);
67         void exclude(const ProfileNode* profileNode);
68         void restoreAll();
69
70 #ifndef NDEBUG
71         void debugPrintData() const;
72         void debugPrintDataSampleStyle() const;
73 #endif
74         typedef void (Profile::*ProfileFunction)(const CallIdentifier& callIdentifier);
75
76     private:
77         Profile(const UString& title, ExecState* originatingGlobalExec, unsigned pageGroupIdentifier, ProfilerClient*);
78         void removeProfileStart();
79         void removeProfileEnd();
80
81         UString m_title;
82         ExecState* m_originatingGlobalExec;
83         unsigned m_pageGroupIdentifier;
84         RefPtr<ProfileNode> m_head;
85         RefPtr<ProfileNode> m_currentNode;
86         ProfilerClient* m_client;
87         bool m_stoppedProfiling;
88     };
89
90 } // namespace KJS
91
92 #endif // Profiler_h