849a1c7b1170c33a47ebd7f19a4ecec341399de6
[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 }
42
43 }
44 }
45
46 namespace JSC {
47
48 class JSValue;
49
50 enum RuntimeType {
51     TypeNothing            = 0x0,
52     TypeFunction           = 0x1,
53     TypeUndefined          = 0x2,
54     TypeNull               = 0x4,
55     TypeBoolean            = 0x8,
56     TypeMachineInt         = 0x10,
57     TypeNumber             = 0x20,
58     TypeString             = 0x40,
59     TypeObject             = 0x80
60 };
61
62 class StructureShape : public RefCounted<StructureShape> {
63     friend class TypeSet;
64
65 public:
66     StructureShape();
67
68     static PassRefPtr<StructureShape> create() { return adoptRef(new StructureShape); }
69     String propertyHash();
70     void markAsFinal();
71     void addProperty(RefPtr<StringImpl>);
72     String stringRepresentation();
73     String toJSONString() const;
74     PassRefPtr<Inspector::Protocol::Runtime::StructureDescription> inspectorRepresentation();
75     void setConstructorName(String name) { m_constructorName = (name.isEmpty() ? "Object" : name); }
76     String constructorName() { return m_constructorName; }
77     void setProto(PassRefPtr<StructureShape> shape) { m_proto = shape; }
78     void enterDictionaryMode();
79
80 private:
81     static String leastCommonAncestor(const Vector<RefPtr<StructureShape>>);
82     static PassRefPtr<StructureShape> merge(const PassRefPtr<StructureShape>, const PassRefPtr<StructureShape>);
83     bool hasSamePrototypeChain(PassRefPtr<StructureShape>);
84
85     HashSet<RefPtr<StringImpl>> m_fields;
86     HashSet<RefPtr<StringImpl>> m_optionalFields;
87     RefPtr<StructureShape> m_proto;
88     std::unique_ptr<String> m_propertyHash;
89     String m_constructorName;
90     bool m_final;
91     bool m_isInDictionaryMode;
92 };
93
94 class TypeSet : public RefCounted<TypeSet> {
95
96 public:
97     static PassRefPtr<TypeSet> create() { return adoptRef(new TypeSet); }
98     TypeSet();
99     void addTypeInformation(RuntimeType, PassRefPtr<StructureShape>, StructureID);
100     static RuntimeType getRuntimeTypeForValue(JSValue);
101     void invalidateCache();
102     JS_EXPORT_PRIVATE String seenTypes() const;
103     String displayName() const;
104     PassRefPtr<Inspector::Protocol::Array<String>> allPrimitiveTypeNames() const;
105     PassRefPtr<Inspector::Protocol::Array<Inspector::Protocol::Runtime::StructureDescription>> allStructureRepresentations() const;
106     String toJSONString() const;
107     bool isOverflown() const { return m_isOverflown; }
108
109 private:
110     String leastCommonAncestor() const;
111     void dumpSeenTypes();
112     bool doesTypeConformTo(uint32_t test) const;
113
114     uint32_t m_seenTypes;
115     bool m_isOverflown;
116     Vector<RefPtr<StructureShape>> m_structureHistory;
117     HashSet<StructureID> m_structureIDCache;
118 };
119
120 } //namespace JSC
121
122 #endif //TypeSet_h