Web Inspector: Modify the type profiler runtime protocol to transfer some computation...
[WebKit-https.git] / Source / JavaScriptCore / runtime / TypeSet.h
1 /*
2  * Copyright (C) 2008, 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 TypeSet_h
27 #define TypeSet_h
28
29 #include "StructureIDTable.h"
30 #include <wtf/HashSet.h>
31 #include <wtf/RefCounted.h>
32 #include <wtf/text/WTFString.h>
33 #include <wtf/Vector.h>
34
35 namespace Inspector {
36 namespace Protocol  {
37 template<typename T> class Array;
38
39 namespace Runtime {
40 class StructureDescription;
41 class TypeSet;
42 }
43
44 }
45 }
46
47 namespace JSC {
48
49 class JSValue;
50
51 enum RuntimeType {
52     TypeNothing            = 0x0,
53     TypeFunction           = 0x1,
54     TypeUndefined          = 0x2,
55     TypeNull               = 0x4,
56     TypeBoolean            = 0x8,
57     TypeMachineInt         = 0x10,
58     TypeNumber             = 0x20,
59     TypeString             = 0x40,
60     TypeObject             = 0x80
61 };
62
63 class StructureShape : public RefCounted<StructureShape> {
64     friend class TypeSet;
65
66 public:
67     StructureShape();
68
69     static PassRefPtr<StructureShape> create() { return adoptRef(new StructureShape); }
70     String propertyHash();
71     void markAsFinal();
72     void addProperty(RefPtr<StringImpl>);
73     String stringRepresentation();
74     String toJSONString() const;
75     PassRefPtr<Inspector::Protocol::Runtime::StructureDescription> inspectorRepresentation();
76     void setConstructorName(String name) { m_constructorName = (name.isEmpty() ? "Object" : name); }
77     String constructorName() { return m_constructorName; }
78     void setProto(PassRefPtr<StructureShape> shape) { m_proto = shape; }
79     void enterDictionaryMode();
80
81 private:
82     static String leastCommonAncestor(const Vector<RefPtr<StructureShape>>);
83     static PassRefPtr<StructureShape> merge(const PassRefPtr<StructureShape>, const PassRefPtr<StructureShape>);
84     bool hasSamePrototypeChain(PassRefPtr<StructureShape>);
85
86     HashSet<RefPtr<StringImpl>> m_fields;
87     HashSet<RefPtr<StringImpl>> m_optionalFields;
88     RefPtr<StructureShape> m_proto;
89     std::unique_ptr<String> m_propertyHash;
90     String m_constructorName;
91     bool m_final;
92     bool m_isInDictionaryMode;
93 };
94
95 class TypeSet : public RefCounted<TypeSet> {
96
97 public:
98     static PassRefPtr<TypeSet> create() { return adoptRef(new TypeSet); }
99     TypeSet();
100     void addTypeInformation(RuntimeType, PassRefPtr<StructureShape>, StructureID);
101     static RuntimeType getRuntimeTypeForValue(JSValue);
102     void invalidateCache();
103     JS_EXPORT_PRIVATE String seenTypes() const;
104     String displayName() const;
105     PassRefPtr<Inspector::Protocol::Array<String>> allPrimitiveTypeNames() const;
106     PassRefPtr<Inspector::Protocol::Array<Inspector::Protocol::Runtime::StructureDescription>> allStructureRepresentations() const;
107     String toJSONString() const;
108     bool isOverflown() const { return m_isOverflown; }
109     String leastCommonAncestor() const;
110     PassRefPtr<Inspector::Protocol::Runtime::TypeSet> inspectorTypeSet() const;
111
112 private:
113     void dumpSeenTypes();
114     bool doesTypeConformTo(uint32_t test) const;
115
116     uint32_t m_seenTypes;
117     bool m_isOverflown;
118     Vector<RefPtr<StructureShape>> m_structureHistory;
119     HashSet<StructureID> m_structureIDCache;
120 };
121
122 } //namespace JSC
123
124 #endif //TypeSet_h