wasm-features.h 2.11 KB
Newer Older
1 2 3 4 5 6 7 8
// 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.
9
#include "src/base/enum-set.h"
10 11 12 13 14 15 16 17
#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 {
18

19
class Isolate;
20

21 22
namespace wasm {

23 24 25 26 27
enum WasmFeature {
#define DECL_FEATURE_ENUM(feat, ...) kFeature_##feat,
  FOREACH_WASM_FEATURE(DECL_FEATURE_ENUM)
#undef DECL_FEATURE_ENUM
};
28 29

// Enabled or detected features.
30 31
class WasmFeatures : public base::EnumSet<WasmFeature> {
 public:
32
  constexpr WasmFeatures() = default;
33 34
  explicit constexpr WasmFeatures(std::initializer_list<WasmFeature> features)
      : EnumSet(features) {}
35

36 37
  // Simplified getters. Use {has_foo()} instead of {contains(kFeature_foo)}.
#define DECL_FEATURE_GETTER(feat, ...) \
38
  constexpr bool has_##feat() const { return contains(kFeature_##feat); }
39 40
  FOREACH_WASM_FEATURE(DECL_FEATURE_GETTER)
#undef DECL_FEATURE_GETTER
41

42 43 44 45 46 47 48 49 50
  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
  }
51 52 53 54 55 56
  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*);
};
57

58 59 60 61 62 63
// static
constexpr WasmFeatures WasmFeatures::All() {
#define LIST_FEATURE(feat, ...) kFeature_##feat,
  return WasmFeatures({FOREACH_WASM_FEATURE(LIST_FEATURE)});
#undef LIST_FEATURE
}
64

65 66
// static
constexpr WasmFeatures WasmFeatures::None() { return {}; }
67

68 69
// static
constexpr WasmFeatures WasmFeatures::ForAsmjs() { return {}; }
70 71 72 73 74 75

}  // namespace wasm
}  // namespace internal
}  // namespace v8

#endif  // V8_WASM_WASM_FEATURES_H_