[JSC] GetterSetter should be JSCell, not JSObject
[WebKit-https.git] / Source / JavaScriptCore / runtime / JSType.h
1 /*
2  *  Copyright (C) 2006-2019 Apple Inc. All rights reserved.
3  *
4  *  This library is free software; you can redistribute it and/or
5  *  modify it under the terms of the GNU Library General Public
6  *  License as published by the Free Software Foundation; either
7  *  version 2 of the License, or (at your option) any later version.
8  *
9  *  This library is distributed in the hope that it will be useful,
10  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  *  Library General Public License for more details.
13  *
14  *  You should have received a copy of the GNU Library General Public License
15  *  along with this library; see the file COPYING.LIB.  If not, write to
16  *  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17  *  Boston, MA 02110-1301, USA.
18  *
19  */
20
21 #pragma once
22
23 namespace JSC {
24
25 enum JSType : uint8_t {
26     // The CellType value must come before any JSType that is a JSCell.
27     CellType,
28     StringType,
29     SymbolType,
30     BigIntType,
31
32     GetterSetterType,
33     CustomGetterSetterType,
34     APIValueWrapperType,
35
36     NativeExecutableType,
37
38     ProgramExecutableType,
39     ModuleProgramExecutableType,
40     EvalExecutableType,
41     FunctionExecutableType,
42
43     UnlinkedFunctionExecutableType,
44
45     UnlinkedProgramCodeBlockType,
46     UnlinkedModuleProgramCodeBlockType,
47     UnlinkedEvalCodeBlockType,
48     UnlinkedFunctionCodeBlockType,
49         
50     CodeBlockType,
51
52     JSFixedArrayType,
53     JSImmutableButterflyType,
54     JSSourceCodeType,
55     JSScriptFetcherType,
56     JSScriptFetchParametersType,
57
58     // The ObjectType value must come before any JSType that is a subclass of JSObject.
59     ObjectType,
60     FinalObjectType,
61     JSCalleeType,
62     JSFunctionType,
63     InternalFunctionType,
64     NumberObjectType,
65     ErrorInstanceType,
66     PureForwardingProxyType,
67     ImpureProxyType,
68     DirectArgumentsType,
69     ScopedArgumentsType,
70     ClonedArgumentsType,
71
72     // Start JSArray types.
73     ArrayType,
74     DerivedArrayType,
75     // End JSArray types.
76
77     ArrayBufferType,
78
79     // Start JSArrayBufferView types. Keep in sync with the order of FOR_EACH_TYPED_ARRAY_TYPE_EXCLUDING_DATA_VIEW.
80     Int8ArrayType,
81     Uint8ArrayType,
82     Uint8ClampedArrayType,
83     Int16ArrayType,
84     Uint16ArrayType,
85     Int32ArrayType,
86     Uint32ArrayType,
87     Float32ArrayType,
88     Float64ArrayType,
89     DataViewType,
90     // End JSArrayBufferView types.
91
92     // JSScope <- JSWithScope
93     //         <- StrictEvalActivation
94     //         <- JSSymbolTableObject  <- JSLexicalEnvironment      <- JSModuleEnvironment
95     //                                 <- JSSegmentedVariableObject <- JSGlobalLexicalEnvironment
96     //                                                              <- JSGlobalObject
97     // Start JSScope types.
98     // Start environment record types.
99     GlobalObjectType,
100     GlobalLexicalEnvironmentType,
101     LexicalEnvironmentType,
102     ModuleEnvironmentType,
103     StrictEvalActivationType,
104     // End environment record types.
105     WithScopeType,
106     // End JSScope types.
107
108     ModuleNamespaceObjectType,
109     RegExpObjectType,
110     ProxyObjectType,
111     JSGeneratorType,
112     JSAsyncGeneratorType,
113     JSPromiseType,
114     JSMapType,
115     JSSetType,
116     JSWeakMapType,
117     JSWeakSetType,
118     WebAssemblyToJSCalleeType,
119     StringObjectType,
120
121     LastJSCObjectType = StringObjectType, // This is the last "JSC" Object type. After this, we have embedder's (e.g., WebCore) extended object types.
122     MaxJSType = 0b11111111,
123 };
124
125 static constexpr uint32_t FirstTypedArrayType = Int8ArrayType;
126 static constexpr uint32_t LastTypedArrayType = DataViewType;
127
128 // LastObjectType should be MaxJSType (not LastJSCObjectType) since embedders can add their extended object types after the enums listed in JSType.
129 static constexpr uint32_t FirstObjectType = ObjectType;
130 static constexpr uint32_t LastObjectType = MaxJSType;
131
132 static constexpr uint32_t NumberOfTypedArrayTypes = LastTypedArrayType - FirstTypedArrayType + 1;
133 static constexpr uint32_t NumberOfTypedArrayTypesExcludingDataView = NumberOfTypedArrayTypes - 1;
134
135 static_assert(sizeof(JSType) == sizeof(uint8_t), "sizeof(JSType) is one byte.");
136 static_assert(LastJSCObjectType < 128, "The highest bit is reserved for embedder's extension.");
137
138 inline constexpr bool isTypedArrayType(JSType type)
139 {
140     return (static_cast<uint32_t>(type) - FirstTypedArrayType) < NumberOfTypedArrayTypesExcludingDataView;
141 }
142
143 } // namespace JSC
144
145 namespace WTF {
146
147 class PrintStream;
148
149 void printInternal(PrintStream&, JSC::JSType);
150
151 } // namespace WTF