// 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 { public: constexpr WasmFeatures() = default; explicit constexpr WasmFeatures(std::initializer_list features) : EnumSet(features) {} // Simplified getters. Use {has_foo()} instead of {contains(kFeature_foo)}. #define DECL_FEATURE_GETTER(feat, ...) \ constexpr 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_