[JSC] Add inherits<T>(VM&) leveraging JSCast fast path
[WebKit-https.git] / Source / JavaScriptCore / runtime / JSType.h
1 /*
2  *  Copyright (C) 2006-2018 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     CustomGetterSetterType,
33     APIValueWrapperType,
34
35     ProgramExecutableType,
36     ModuleProgramExecutableType,
37     EvalExecutableType,
38     FunctionExecutableType,
39
40     UnlinkedFunctionExecutableType,
41
42     UnlinkedProgramCodeBlockType,
43     UnlinkedModuleProgramCodeBlockType,
44     UnlinkedEvalCodeBlockType,
45     UnlinkedFunctionCodeBlockType,
46         
47     CodeBlockType,
48
49     JSFixedArrayType,
50     JSSourceCodeType,
51     JSScriptFetcherType,
52     JSScriptFetchParametersType,
53
54     // The ObjectType value must come before any JSType that is a subclass of JSObject.
55     ObjectType,
56     FinalObjectType,
57     JSCalleeType,
58     JSFunctionType,
59     InternalFunctionType,
60     NumberObjectType,
61     ErrorInstanceType,
62     PureForwardingProxyType,
63     ImpureProxyType,
64     DirectArgumentsType,
65     ScopedArgumentsType,
66     ClonedArgumentsType,
67
68     // Start JSArray types.
69     ArrayType,
70     DerivedArrayType,
71     // End JSArray types.
72
73     // Start JSArrayBufferView types.
74     Int8ArrayType,
75     Uint8ArrayType,
76     Uint8ClampedArrayType,
77     Int16ArrayType,
78     Uint16ArrayType,
79     Int32ArrayType,
80     Uint32ArrayType,
81     Float32ArrayType,
82     Float64ArrayType,
83     DataViewType,
84     // End JSArrayBufferView types.
85
86     GetterSetterType,
87
88     // JSScope <- JSWithScope
89     //         <- StrictEvalActivation
90     //         <- JSSymbolTableObject  <- JSLexicalEnvironment      <- JSModuleEnvironment
91     //                                 <- JSSegmentedVariableObject <- JSGlobalLexicalEnvironment
92     //                                                              <- JSGlobalObject
93     // Start JSScope types.
94     // Start environment record types.
95     GlobalObjectType,
96     GlobalLexicalEnvironmentType,
97     LexicalEnvironmentType,
98     ModuleEnvironmentType,
99     StrictEvalActivationType,
100     // End environment record types.
101     WithScopeType,
102     // End JSScope types.
103
104     RegExpObjectType,
105     ProxyObjectType,
106     JSMapType,
107     JSSetType,
108     JSWeakMapType,
109     JSWeakSetType,
110
111     WebAssemblyFunctionType,
112     WebAssemblyToJSCalleeType,
113
114     LastJSCObjectType = WebAssemblyToJSCalleeType, // This is the last "JSC" Object type. After this, we have embedder's (e.g., WebCore) extended object types.
115     MaxJSType = 0b11111111,
116 };
117
118 static const uint32_t FirstTypedArrayType = Int8ArrayType;
119 static const uint32_t LastTypedArrayType = DataViewType;
120
121 // LastObjectType should be MaxJSType (not LastJSCObjectType) since embedders can add their extended object types after the enums listed in JSType.
122 static const uint32_t FirstObjectType = ObjectType;
123 static const uint32_t LastObjectType = MaxJSType;
124
125 static constexpr uint32_t NumberOfTypedArrayTypes = LastTypedArrayType - FirstTypedArrayType + 1;
126 static constexpr uint32_t NumberOfTypedArrayTypesExcludingDataView = NumberOfTypedArrayTypes - 1;
127
128 static_assert(sizeof(JSType) == sizeof(uint8_t), "sizeof(JSType) is one byte.");
129 static_assert(LastJSCObjectType < 128, "The highest bit is reserved for embedder's extension.");
130
131 } // namespace JSC