| // Copyright 2019 the V8 project authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef V8_OBJECTS_FUNCTION_KIND_H_ |
| #define V8_OBJECTS_FUNCTION_KIND_H_ |
| |
| #include "src/base/bounds.h" |
| #include "src/base/macros.h" |
| |
| namespace v8 { |
| namespace internal { |
| |
| enum FunctionKind : uint8_t { |
| // BEGIN constructable functions |
| kNormalFunction, |
| kModule, |
| kAsyncModule, |
| // BEGIN class constructors |
| // BEGIN base constructors |
| kBaseConstructor, |
| // BEGIN default constructors |
| kDefaultBaseConstructor, |
| // END base constructors |
| // BEGIN derived constructors |
| kDefaultDerivedConstructor, |
| // END default constructors |
| kDerivedConstructor, |
| // END derived constructors |
| // END class constructors |
| // END constructable functions. |
| // BEGIN accessors |
| kGetterFunction, |
| kSetterFunction, |
| // END accessors |
| // BEGIN arrow functions |
| kArrowFunction, |
| // BEGIN async functions |
| kAsyncArrowFunction, |
| // END arrow functions |
| kAsyncFunction, |
| // BEGIN concise methods 1 |
| kAsyncConciseMethod, |
| // BEGIN generators |
| kAsyncConciseGeneratorMethod, |
| // END concise methods 1 |
| kAsyncGeneratorFunction, |
| // END async functions |
| kGeneratorFunction, |
| // BEGIN concise methods 2 |
| kConciseGeneratorMethod, |
| // END generators |
| kConciseMethod, |
| kClassMembersInitializerFunction, |
| // END concise methods 2 |
| |
| kLastFunctionKind = kClassMembersInitializerFunction, |
| }; |
| |
| constexpr int kFunctionKindBitSize = 5; |
| STATIC_ASSERT(kLastFunctionKind < (1 << kFunctionKindBitSize)); |
| |
| inline bool IsArrowFunction(FunctionKind kind) { |
| return base::IsInRange(kind, FunctionKind::kArrowFunction, |
| FunctionKind::kAsyncArrowFunction); |
| } |
| |
| inline bool IsModule(FunctionKind kind) { |
| return base::IsInRange(kind, FunctionKind::kModule, |
| FunctionKind::kAsyncModule); |
| } |
| |
| inline bool IsAsyncModule(FunctionKind kind) { |
| return kind == FunctionKind::kAsyncModule; |
| } |
| |
| inline bool IsAsyncGeneratorFunction(FunctionKind kind) { |
| return base::IsInRange(kind, FunctionKind::kAsyncConciseGeneratorMethod, |
| FunctionKind::kAsyncGeneratorFunction); |
| } |
| |
| inline bool IsGeneratorFunction(FunctionKind kind) { |
| return base::IsInRange(kind, FunctionKind::kAsyncConciseGeneratorMethod, |
| FunctionKind::kConciseGeneratorMethod); |
| } |
| |
| inline bool IsAsyncFunction(FunctionKind kind) { |
| return base::IsInRange(kind, FunctionKind::kAsyncArrowFunction, |
| FunctionKind::kAsyncGeneratorFunction); |
| } |
| |
| inline bool IsResumableFunction(FunctionKind kind) { |
| return IsGeneratorFunction(kind) || IsAsyncFunction(kind) || IsModule(kind); |
| } |
| |
| inline bool IsConciseMethod(FunctionKind kind) { |
| return base::IsInRange(kind, FunctionKind::kAsyncConciseMethod, |
| FunctionKind::kAsyncConciseGeneratorMethod) || |
| base::IsInRange(kind, FunctionKind::kConciseGeneratorMethod, |
| FunctionKind::kClassMembersInitializerFunction); |
| } |
| |
| inline bool IsStrictFunctionWithoutPrototype(FunctionKind kind) { |
| return base::IsInRange(kind, FunctionKind::kGetterFunction, |
| FunctionKind::kAsyncArrowFunction) || |
| base::IsInRange(kind, FunctionKind::kAsyncConciseMethod, |
| FunctionKind::kAsyncConciseGeneratorMethod) || |
| base::IsInRange(kind, FunctionKind::kConciseGeneratorMethod, |
| FunctionKind::kClassMembersInitializerFunction); |
| } |
| |
| inline bool IsGetterFunction(FunctionKind kind) { |
| return kind == FunctionKind::kGetterFunction; |
| } |
| |
| inline bool IsSetterFunction(FunctionKind kind) { |
| return kind == FunctionKind::kSetterFunction; |
| } |
| |
| inline bool IsAccessorFunction(FunctionKind kind) { |
| return base::IsInRange(kind, FunctionKind::kGetterFunction, |
| FunctionKind::kSetterFunction); |
| } |
| |
| inline bool IsDefaultConstructor(FunctionKind kind) { |
| return base::IsInRange(kind, FunctionKind::kDefaultBaseConstructor, |
| FunctionKind::kDefaultDerivedConstructor); |
| } |
| |
| inline bool IsBaseConstructor(FunctionKind kind) { |
| return base::IsInRange(kind, FunctionKind::kBaseConstructor, |
| FunctionKind::kDefaultBaseConstructor); |
| } |
| |
| inline bool IsDerivedConstructor(FunctionKind kind) { |
| return base::IsInRange(kind, FunctionKind::kDefaultDerivedConstructor, |
| FunctionKind::kDerivedConstructor); |
| } |
| |
| inline bool IsClassConstructor(FunctionKind kind) { |
| return base::IsInRange(kind, FunctionKind::kBaseConstructor, |
| FunctionKind::kDerivedConstructor); |
| } |
| |
| inline bool IsClassMembersInitializerFunction(FunctionKind kind) { |
| return kind == FunctionKind::kClassMembersInitializerFunction; |
| } |
| |
| inline bool IsConstructable(FunctionKind kind) { |
| return base::IsInRange(kind, FunctionKind::kNormalFunction, |
| FunctionKind::kDerivedConstructor); |
| } |
| |
| inline const char* FunctionKind2String(FunctionKind kind) { |
| switch (kind) { |
| case FunctionKind::kNormalFunction: |
| return "NormalFunction"; |
| case FunctionKind::kArrowFunction: |
| return "ArrowFunction"; |
| case FunctionKind::kGeneratorFunction: |
| return "GeneratorFunction"; |
| case FunctionKind::kConciseMethod: |
| return "ConciseMethod"; |
| case FunctionKind::kDerivedConstructor: |
| return "DerivedConstructor"; |
| case FunctionKind::kBaseConstructor: |
| return "BaseConstructor"; |
| case FunctionKind::kGetterFunction: |
| return "GetterFunction"; |
| case FunctionKind::kSetterFunction: |
| return "SetterFunction"; |
| case FunctionKind::kAsyncFunction: |
| return "AsyncFunction"; |
| case FunctionKind::kModule: |
| return "Module"; |
| case FunctionKind::kAsyncModule: |
| return "AsyncModule"; |
| case FunctionKind::kClassMembersInitializerFunction: |
| return "ClassMembersInitializerFunction"; |
| case FunctionKind::kDefaultBaseConstructor: |
| return "DefaultBaseConstructor"; |
| case FunctionKind::kDefaultDerivedConstructor: |
| return "DefaultDerivedConstructor"; |
| case FunctionKind::kAsyncArrowFunction: |
| return "AsyncArrowFunction"; |
| case FunctionKind::kAsyncConciseMethod: |
| return "AsyncConciseMethod"; |
| case FunctionKind::kConciseGeneratorMethod: |
| return "ConciseGeneratorMethod"; |
| case FunctionKind::kAsyncConciseGeneratorMethod: |
| return "AsyncConciseGeneratorMethod"; |
| case FunctionKind::kAsyncGeneratorFunction: |
| return "AsyncGeneratorFunction"; |
| } |
| UNREACHABLE(); |
| } |
| |
| inline std::ostream& operator<<(std::ostream& os, FunctionKind kind) { |
| return os << FunctionKind2String(kind); |
| } |
| |
| } // namespace internal |
| } // namespace v8 |
| |
| #endif // V8_OBJECTS_FUNCTION_KIND_H_ |