dc8ce4ae00442280e88a1a1b56c9ef98f8d51320
[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 #pragma once
27
28 #include "CodeBlock.h"
29 #include "TypeLocation.h"
30 #include "TypeLocationCache.h"
31 #include <wtf/Bag.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 enum TypeProfilerSearchDescriptor {
43     TypeProfilerSearchDescriptorNormal = 1,
44     TypeProfilerSearchDescriptorFunctionReturn = 2
45 };
46
47 struct QueryKey {
48     QueryKey()
49         : m_sourceID(0)
50         , m_divot(0)
51         , m_searchDescriptor(TypeProfilerSearchDescriptorFunctionReturn)
52     { }
53
54     QueryKey(intptr_t sourceID, unsigned divot, TypeProfilerSearchDescriptor searchDescriptor)
55         : m_sourceID(sourceID)
56         , m_divot(divot)
57         , m_searchDescriptor(searchDescriptor)
58     { }
59
60     QueryKey(WTF::HashTableDeletedValueType)
61         : m_sourceID(INTPTR_MAX)
62         , m_divot(UINT_MAX)
63         , m_searchDescriptor(TypeProfilerSearchDescriptorFunctionReturn)
64     { }
65
66     bool isHashTableDeletedValue() const 
67     { 
68         return m_sourceID == INTPTR_MAX 
69             && m_divot == UINT_MAX
70             && m_searchDescriptor == TypeProfilerSearchDescriptorFunctionReturn;
71     }
72
73     bool operator==(const QueryKey& other) const
74     {
75         return m_sourceID == other.m_sourceID 
76             && m_divot == other.m_divot
77             && m_searchDescriptor == other.m_searchDescriptor;
78     }
79
80     unsigned hash() const 
81     { 
82         unsigned hash = m_sourceID + m_divot * m_searchDescriptor;
83         return hash;
84     }
85
86     intptr_t m_sourceID;
87     unsigned m_divot;
88     TypeProfilerSearchDescriptor m_searchDescriptor;
89 };
90
91 struct QueryKeyHash {
92     static unsigned hash(const QueryKey& key) { return key.hash(); }
93     static bool equal(const QueryKey& a, const QueryKey& b) { return a == b; }
94     static const bool safeToCompareToEmptyOrDeleted = true;
95 };
96
97 } // namespace JSC
98
99 namespace WTF {
100
101 template<typename T> struct DefaultHash;
102 template<> struct DefaultHash<JSC::QueryKey> {
103     typedef JSC::QueryKeyHash Hash;
104 };
105
106 template<typename T> struct HashTraits;
107 template<> struct HashTraits<JSC::QueryKey> : SimpleClassHashTraits<JSC::QueryKey> {
108     static const bool emptyValueIsZero = false;
109 };
110
111 } // namespace WTF
112
113 namespace JSC {
114
115 class VM;
116
117 class TypeProfiler {
118     WTF_MAKE_FAST_ALLOCATED;
119 public:
120     TypeProfiler();
121     void logTypesForTypeLocation(TypeLocation*, VM&);
122     JS_EXPORT_PRIVATE String typeInformationForExpressionAtOffset(TypeProfilerSearchDescriptor, unsigned offset, intptr_t sourceID, VM&);
123     void insertNewLocation(TypeLocation*);
124     TypeLocationCache* typeLocationCache() { return &m_typeLocationCache; }
125     TypeLocation* findLocation(unsigned divot, intptr_t sourceID, TypeProfilerSearchDescriptor, VM&);
126     GlobalVariableID getNextUniqueVariableID() { return m_nextUniqueVariableID++; }
127     TypeLocation* nextTypeLocation();
128     void invalidateTypeSetCache();
129     void dumpTypeProfilerData(VM&);
130     
131 private:
132     typedef HashMap<intptr_t, Vector<TypeLocation*>> SourceIDToLocationBucketMap;
133     SourceIDToLocationBucketMap m_bucketMap;
134     TypeLocationCache m_typeLocationCache;
135     typedef HashMap<QueryKey, TypeLocation*> TypeLocationQueryCache;
136     TypeLocationQueryCache m_queryCache;
137     GlobalVariableID m_nextUniqueVariableID;
138     Bag<TypeLocation> m_typeLocationInfo;
139 };
140
141 } // namespace JSC