summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/wasm-type.h63
-rw-r--r--src/wasm/literal.cpp3
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);