478394d3803f466805c0c86bc4edde8c609b2d0b
[WebKit-https.git] / Source / JavaScriptCore / runtime / TypeProfiler.h
1 /*
2  * Copyright (C) 2014 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 TypeProfiler_h
27 #define TypeProfiler_h
28
29 #include "CodeBlock.h"
30 #include "FunctionHasExecutedCache.h"
31 #include "TypeLocationCache.h"
32 #include <wtf/HashMap.h>
33 #include <wtf/Vector.h>
34 #include <wtf/text/WTFString.h>
35
36 namespace Inspector { namespace Protocol  { namespace Runtime {
37 class TypeDescription;
38 }}}
39
40 namespace JSC {
41
42 class TypeLocation;
43
44 struct QueryKey {
45     QueryKey()
46         : m_sourceID(0)
47         , m_divot(0)
48     { }
49
50     QueryKey(intptr_t sourceID, unsigned divot)
51         : m_sourceID(sourceID)
52         , m_divot(divot)
53     { }
54
55     QueryKey(WTF::HashTableDeletedValueType)
56         : m_sourceID(INTPTR_MAX)
57         , m_divot(UINT_MAX)
58     { }
59
60     bool isHashTableDeletedValue() const { return m_sourceID == INTPTR_MAX && m_divot == UINT_MAX; }
61     bool operator==(const QueryKey& other) const { return m_sourceID == other.m_sourceID && m_divot == other.m_divot; }
62     unsigned hash() const { return m_sourceID + m_divot; }
63
64     intptr_t m_sourceID;
65     unsigned m_divot;
66 };
67
68 struct QueryKeyHash {
69     static unsigned hash(const QueryKey& key) { return key.hash(); }
70     static bool equal(const QueryKey& a, const QueryKey& b) { return a == b; }
71     static const bool safeToCompareToEmptyOrDeleted = true;
72 };
73
74 } // namespace JSC
75
76 namespace WTF {
77
78 template<typename T> struct DefaultHash;
79 template<> struct DefaultHash<JSC::QueryKey> {
80     typedef JSC::QueryKeyHash Hash;
81 };
82
83 template<typename T> struct HashTraits;
84 template<> struct HashTraits<JSC::QueryKey> : SimpleClassHashTraits<JSC::QueryKey> { };
85
86 } // namespace WTF
87
88 namespace JSC {
89
90 enum TypeProfilerSearchDescriptor {
91     TypeProfilerSearchDescriptorNormal = 1,
92     TypeProfilerSearchDescriptorFunctionReturn = 2
93 };
94
95 class TypeProfiler {
96 public:
97     void logTypesForTypeLocation(TypeLocation*);
98     void getTypesForVariableAtOffsetForInspector(TypeProfilerSearchDescriptor, unsigned divot, intptr_t sourceID, RefPtr<Inspector::Protocol::Runtime::TypeDescription>&);
99     JS_EXPORT_PRIVATE String typeInformationForExpressionAtOffset(TypeProfilerSearchDescriptor, unsigned offset, intptr_t sourceID);
100     void insertNewLocation(TypeLocation*);
101     FunctionHasExecutedCache* functionHasExecutedCache() { return &m_functionHasExecutedCache; }
102     TypeLocationCache* typeLocationCache() { return &m_typeLocationCache; }
103     
104 private:
105     TypeLocation* findLocation(unsigned divot, intptr_t sourceID, TypeProfilerSearchDescriptor);
106     typedef HashMap<intptr_t, Vector<TypeLocation*>> SourceIDToLocationBucketMap;
107     SourceIDToLocationBucketMap m_bucketMap;
108     FunctionHasExecutedCache m_functionHasExecutedCache;
109     TypeLocationCache m_typeLocationCache;
110     typedef HashMap<QueryKey, TypeLocation*> TypeLocationQueryCache;
111     TypeLocationQueryCache m_queryCache;
112 };
113
114 } // namespace JSC
115
116 #endif // TypeProfiler_h