blob: 8e86c4824aadddf495140b7413187d0072e82624 [file] [log] [blame]
// Copyright 2017 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_VALUE_H_
#define V8_WASM_VALUE_H_
#include "src/wasm/wasm-opcodes.h"
#include "src/zone/zone-containers.h"
namespace v8 {
namespace internal {
namespace wasm {
// Macro for defining WasmValue union members.
#define FOREACH_WASMVAL_UNION_MEMBER(V) \
V(i32, kWasmI32, int32_t) \
V(u32, kWasmI32, uint32_t) \
V(i64, kWasmI64, int64_t) \
V(u64, kWasmI64, uint64_t) \
V(f32, kWasmF32, float) \
V(f64, kWasmF64, double)
// A wasm value with type information.
class WasmValue {
public:
WasmValue() : type_(kWasmStmt) {}
#define DEFINE_TYPE_SPECIFIC_METHODS(field, localtype, ctype) \
explicit WasmValue(ctype v) : type_(localtype) { value_.field = v; } \
ctype to_##field() const { \
DCHECK_EQ(localtype, type_); \
return value_.field; \
}
FOREACH_WASMVAL_UNION_MEMBER(DEFINE_TYPE_SPECIFIC_METHODS)
#undef DEFINE_TYPE_SPECIFIC_METHODS
ValueType type() const { return type_; }
bool operator==(const WasmValue& other) const {
if (type_ != other.type_) return false;
#define CHECK_VALUE_EQ(field, localtype, ctype) \
if (type_ == localtype) { \
return value_.field == other.value_.field; \
}
FOREACH_WASMVAL_UNION_MEMBER(CHECK_VALUE_EQ)
#undef CHECK_VALUE_EQ
UNREACHABLE();
}
template <typename T>
inline T to() const {
static_assert(sizeof(T) == -1, "Do only use this method with valid types");
}
template <typename T>
inline T to_unchecked() const {
static_assert(sizeof(T) == -1, "Do only use this method with valid types");
}
private:
ValueType type_;
union {
#define DECLARE_FIELD(field, localtype, ctype) ctype field;
FOREACH_WASMVAL_UNION_MEMBER(DECLARE_FIELD)
#undef DECLARE_FIELD
} value_;
};
#define DECLARE_CAST(field, localtype, ctype) \
template <> \
inline ctype WasmValue::to_unchecked() const { \
return value_.field; \
} \
template <> \
inline ctype WasmValue::to() const { \
return to_##field(); \
}
FOREACH_WASMVAL_UNION_MEMBER(DECLARE_CAST)
#undef DECLARE_CAST
} // namespace wasm
} // namespace internal
} // namespace v8
#endif // V8_WASM_VALUE_H_