diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/wasm-type.h | 63 | ||||
-rw-r--r-- | src/wasm/literal.cpp | 3 |
2 files changed, 52 insertions, 14 deletions
diff --git a/src/wasm-type.h b/src/wasm-type.h index 42426c2c1..a7c9f645b 100644 --- a/src/wasm-type.h +++ b/src/wasm-type.h @@ -21,21 +21,58 @@ namespace wasm { -enum Type { - none, - i32, - i64, - f32, - f64, - v128, - anyref, - exnref, - // none means no type, e.g. a block can have no return type. but unreachable - // is different, as it can be "ignored" when doing type checking across - // branches - unreachable +class Type { + uint32_t id; + +public: + enum ValueType : uint32_t { + none, + i32, + i64, + f32, + f64, + v128, + anyref, + exnref, + // none means no type, e.g. a block can have no return type. but unreachable + // is different, as it can be "ignored" when doing type checking across + // branches + unreachable + }; + + Type() = default; + + // ValueType can be implicitly upgraded to Type + constexpr Type(ValueType id) : id(id){}; + + // But converting raw uint32_t is more dangerous, so make it explicit + constexpr explicit Type(uint32_t id) : id(id){}; + + // (In)equality must be defined for both Type and ValueType because it is + // otherwise ambiguous whether to convert both this and other to int or + // convert other to Type. + bool operator==(const Type& other) { return id == other.id; } + + bool operator==(const ValueType& other) { return id == other; } + + bool operator!=(const Type& other) { return id != other.id; } + + bool operator!=(const ValueType& other) { return id != other; } + + // Allows for using Types in switch statements + constexpr operator int() const { return id; } }; +constexpr Type none = Type::none; +constexpr Type i32 = Type::i32; +constexpr Type i64 = Type::i64; +constexpr Type f32 = Type::f32; +constexpr Type f64 = Type::f64; +constexpr Type v128 = Type::v128; +constexpr Type anyref = Type::anyref; +constexpr Type exnref = Type::exnref; +constexpr Type unreachable = Type::unreachable; + const char* printType(Type type); unsigned getTypeSize(Type type); FeatureSet getFeatures(Type type); diff --git a/src/wasm/literal.cpp b/src/wasm/literal.cpp index 41d98dea3..8d8868eb4 100644 --- a/src/wasm/literal.cpp +++ b/src/wasm/literal.cpp @@ -1286,7 +1286,8 @@ Literal Literal::shuffleV8x16(const Literal& other, return Literal(bytes); } -template<Type Ty, int Lanes> static Literal splat(const Literal& val) { +template<Type::ValueType Ty, int Lanes> +static Literal splat(const Literal& val) { assert(val.type == Ty); LaneArray<Lanes> lanes; lanes.fill(val); |