| // Copyright 2018 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_WASM_WASM_FEATURES_H_ | 
 | #define V8_WASM_WASM_FEATURES_H_ | 
 |  | 
 | // The feature flags are declared in their own header. | 
 | #include "src/base/enum-set.h" | 
 | #include "src/base/macros.h" | 
 | #include "src/wasm/wasm-feature-flags.h" | 
 |  | 
 | // All features, including features that do not have flags. | 
 | #define FOREACH_WASM_FEATURE FOREACH_WASM_FEATURE_FLAG | 
 |  | 
 | namespace v8 { | 
 | namespace internal { | 
 |  | 
 | class Isolate; | 
 |  | 
 | namespace wasm { | 
 |  | 
 | enum WasmFeature { | 
 | #define DECL_FEATURE_ENUM(feat, ...) kFeature_##feat, | 
 |   FOREACH_WASM_FEATURE(DECL_FEATURE_ENUM) | 
 | #undef DECL_FEATURE_ENUM | 
 | }; | 
 |  | 
 | // Enabled or detected features. | 
 | class WasmFeatures : public base::EnumSet<WasmFeature> { | 
 |  public: | 
 |   constexpr WasmFeatures() = default; | 
 |   explicit constexpr WasmFeatures(std::initializer_list<WasmFeature> features) | 
 |       : EnumSet(features) {} | 
 |  | 
 |   // Simplified getters. Use {has_foo()} instead of {contains(kFeature_foo)}. | 
 | #define DECL_FEATURE_GETTER(feat, ...) \ | 
 |   bool has_##feat() const { return contains(kFeature_##feat); } | 
 |   FOREACH_WASM_FEATURE(DECL_FEATURE_GETTER) | 
 | #undef DECL_FEATURE_GETTER | 
 |  | 
 |   static constexpr const char* name_for_feature(WasmFeature feature) { | 
 |     switch (feature) { | 
 | #define NAME(feat, ...)              \ | 
 |   case WasmFeature::kFeature_##feat: \ | 
 |     return #feat; | 
 |       FOREACH_WASM_FEATURE(NAME) | 
 |     } | 
 | #undef NAME | 
 |   } | 
 |   static inline constexpr WasmFeatures All(); | 
 |   static inline constexpr WasmFeatures None(); | 
 |   static inline constexpr WasmFeatures ForAsmjs(); | 
 |   static WasmFeatures FromFlags(); | 
 |   static V8_EXPORT_PRIVATE WasmFeatures FromIsolate(Isolate*); | 
 | }; | 
 |  | 
 | // static | 
 | constexpr WasmFeatures WasmFeatures::All() { | 
 | #define LIST_FEATURE(feat, ...) kFeature_##feat, | 
 |   return WasmFeatures({FOREACH_WASM_FEATURE(LIST_FEATURE)}); | 
 | #undef LIST_FEATURE | 
 | } | 
 |  | 
 | // static | 
 | constexpr WasmFeatures WasmFeatures::None() { return {}; } | 
 |  | 
 | // static | 
 | constexpr WasmFeatures WasmFeatures::ForAsmjs() { return {}; } | 
 |  | 
 | }  // namespace wasm | 
 | }  // namespace internal | 
 | }  // namespace v8 | 
 |  | 
 | #endif  // V8_WASM_WASM_FEATURES_H_ |