Web Inspector: Move the computation that results in UI strings from JSC to the Web...
[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     String dumpTypes() const;
104     String displayName() const;
105     PassRefPtr<Inspector::Protocol::Array<Inspector::Protocol::Runtime::StructureDescription>> allStructureRepresentations() const;
106     String toJSONString() const;
107     bool isOverflown() const { return m_isOverflown; }
108     String leastCommonAncestor() const;
109     PassRefPtr<Inspector::Protocol::Runtime::TypeSet> inspectorTypeSet() const;
110     bool isEmpty() const { return m_seenTypes == TypeNothing; }
111     bool doesTypeConformTo(uint32_t test) const;
112     uint32_t seenTypes() const { return m_seenTypes; }
113
114 private:
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