1
2// Copyright 2019 the V8 project authors. All rights reserved.
3// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5
6#ifndef V8_FUNCTION_KIND_H_
7#define V8_FUNCTION_KIND_H_
8
9#include "src/utils.h"
10
11namespace v8 {
12namespace internal {
13
14enum FunctionKind : uint8_t {
15 // BEGIN constructable functions
16 kNormalFunction,
17 kModule,
18 // BEGIN class constructors
19 // BEGIN base constructors
20 kBaseConstructor,
21 // BEGIN default constructors
22 kDefaultBaseConstructor,
23 // END base constructors
24 // BEGIN derived cosntructors
25 kDefaultDerivedConstructor,
26 // END default constructors
27 kDerivedConstructor,
28 // END derived costructors
29 // END class cosntructors
30 // END constructable functions.
31 // BEGIN accessors
32 kGetterFunction,
33 kSetterFunction,
34 // END accessors
35 // BEGIN arrow functions
36 kArrowFunction,
37 // BEGIN async functions
38 kAsyncArrowFunction,
39 // END arrow functions
40 kAsyncFunction,
41 // BEGIN concise methods 1
42 kAsyncConciseMethod,
43 // BEGIN generators
44 kAsyncConciseGeneratorMethod,
45 // END concise methods 1
46 kAsyncGeneratorFunction,
47 // END async functions
48 kGeneratorFunction,
49 // BEGIN concise methods 2
50 kConciseGeneratorMethod,
51 // END generators
52 kConciseMethod,
53 kClassMembersInitializerFunction,
54 // END concise methods 2
55
56 kLastFunctionKind = kClassMembersInitializerFunction,
57};
58
59inline bool IsArrowFunction(FunctionKind kind) {
60 return IsInRange(kind, FunctionKind::kArrowFunction,
61 FunctionKind::kAsyncArrowFunction);
62}
63
64inline bool IsModule(FunctionKind kind) {
65 return kind == FunctionKind::kModule;
66}
67
68inline bool IsAsyncGeneratorFunction(FunctionKind kind) {
69 return IsInRange(kind, FunctionKind::kAsyncConciseGeneratorMethod,
70 FunctionKind::kAsyncGeneratorFunction);
71}
72
73inline bool IsGeneratorFunction(FunctionKind kind) {
74 return IsInRange(kind, FunctionKind::kAsyncConciseGeneratorMethod,
75 FunctionKind::kConciseGeneratorMethod);
76}
77
78inline bool IsAsyncFunction(FunctionKind kind) {
79 return IsInRange(kind, FunctionKind::kAsyncArrowFunction,
80 FunctionKind::kAsyncGeneratorFunction);
81}
82
83inline bool IsResumableFunction(FunctionKind kind) {
84 return IsGeneratorFunction(kind) || IsAsyncFunction(kind) || IsModule(kind);
85}
86
87inline bool IsConciseMethod(FunctionKind kind) {
88 return IsInRange(kind, FunctionKind::kAsyncConciseMethod,
89 FunctionKind::kAsyncConciseGeneratorMethod) ||
90 IsInRange(kind, FunctionKind::kConciseGeneratorMethod,
91 FunctionKind::kClassMembersInitializerFunction);
92}
93
94inline bool IsStrictFunctionWithoutPrototype(FunctionKind kind) {
95 return IsInRange(kind, FunctionKind::kGetterFunction,
96 FunctionKind::kAsyncArrowFunction) ||
97 IsInRange(kind, FunctionKind::kAsyncConciseMethod,
98 FunctionKind::kAsyncConciseGeneratorMethod) ||
99 IsInRange(kind, FunctionKind::kConciseGeneratorMethod,
100 FunctionKind::kClassMembersInitializerFunction);
101}
102
103inline bool IsGetterFunction(FunctionKind kind) {
104 return kind == FunctionKind::kGetterFunction;
105}
106
107inline bool IsSetterFunction(FunctionKind kind) {
108 return kind == FunctionKind::kSetterFunction;
109}
110
111inline bool IsAccessorFunction(FunctionKind kind) {
112 return IsInRange(kind, FunctionKind::kGetterFunction,
113 FunctionKind::kSetterFunction);
114}
115
116inline bool IsDefaultConstructor(FunctionKind kind) {
117 return IsInRange(kind, FunctionKind::kDefaultBaseConstructor,
118 FunctionKind::kDefaultDerivedConstructor);
119}
120
121inline bool IsBaseConstructor(FunctionKind kind) {
122 return IsInRange(kind, FunctionKind::kBaseConstructor,
123 FunctionKind::kDefaultBaseConstructor);
124}
125
126inline bool IsDerivedConstructor(FunctionKind kind) {
127 return IsInRange(kind, FunctionKind::kDefaultDerivedConstructor,
128 FunctionKind::kDerivedConstructor);
129}
130
131inline bool IsClassConstructor(FunctionKind kind) {
132 return IsInRange(kind, FunctionKind::kBaseConstructor,
133 FunctionKind::kDerivedConstructor);
134}
135
136inline bool IsClassMembersInitializerFunction(FunctionKind kind) {
137 return kind == FunctionKind::kClassMembersInitializerFunction;
138}
139
140inline bool IsConstructable(FunctionKind kind) {
141 return IsInRange(kind, FunctionKind::kNormalFunction,
142 FunctionKind::kDerivedConstructor);
143}
144
145inline const char* FunctionKind2String(FunctionKind kind) {
146 switch (kind) {
147 case FunctionKind::kNormalFunction:
148 return "NormalFunction";
149 case FunctionKind::kArrowFunction:
150 return "ArrowFunction";
151 case FunctionKind::kGeneratorFunction:
152 return "GeneratorFunction";
153 case FunctionKind::kConciseMethod:
154 return "ConciseMethod";
155 case FunctionKind::kDerivedConstructor:
156 return "DerivedConstructor";
157 case FunctionKind::kBaseConstructor:
158 return "BaseConstructor";
159 case FunctionKind::kGetterFunction:
160 return "GetterFunction";
161 case FunctionKind::kSetterFunction:
162 return "SetterFunction";
163 case FunctionKind::kAsyncFunction:
164 return "AsyncFunction";
165 case FunctionKind::kModule:
166 return "Module";
167 case FunctionKind::kClassMembersInitializerFunction:
168 return "ClassMembersInitializerFunction";
169 case FunctionKind::kDefaultBaseConstructor:
170 return "DefaultBaseConstructor";
171 case FunctionKind::kDefaultDerivedConstructor:
172 return "DefaultDerivedConstructor";
173 case FunctionKind::kAsyncArrowFunction:
174 return "AsyncArrowFunction";
175 case FunctionKind::kAsyncConciseMethod:
176 return "AsyncConciseMethod";
177 case FunctionKind::kConciseGeneratorMethod:
178 return "ConciseGeneratorMethod";
179 case FunctionKind::kAsyncConciseGeneratorMethod:
180 return "AsyncConciseGeneratorMethod";
181 case FunctionKind::kAsyncGeneratorFunction:
182 return "AsyncGeneratorFunction";
183 }
184 UNREACHABLE();
185}
186
187inline std::ostream& operator<<(std::ostream& os, FunctionKind kind) {
188 return os << FunctionKind2String(kind);
189}
190
191} // namespace internal
192} // namespace v8
193
194#endif // V8_FUNCTION_KIND_H_
195