srctree

Robin Linden parent d90e0319 a5845525
wasm: Make ValueType-parsing available outside of wasm.cpp

This will be needed when parsing instructions.

inlinesplit
wasm/wasm.cpp added: 68, removed: 54, total 14
@@ -38,32 +38,9 @@ std::optional<std::uint32_t> parse(std::istream &is) {
return Leb128<std::uint32_t>::decode_from(is);
}
 
// https://webassembly.github.io/spec/core/binary/types.html
template<>
std::optional<ValueType> parse(std::istream &is) {
std::uint8_t byte{};
if (!is.read(reinterpret_cast<char *>(&byte), sizeof(byte))) {
return std::nullopt;
}
 
switch (byte) {
case 0x7f:
return ValueType::Int32;
case 0x7e:
return ValueType::Int64;
case 0x7d:
return ValueType::Float32;
case 0x7c:
return ValueType::Float64;
case 0x7b:
return ValueType::Vector128;
case 0x70:
return ValueType::FunctionReference;
case 0x6f:
return ValueType::ExternReference;
default:
return std::nullopt;
}
return ValueType::parse(is);
}
 
// https://webassembly.github.io/spec/core/binary/types.html#function-types
@@ -135,7 +112,7 @@ std::optional<CodeEntry::Local> parse(std::istream &is) {
return std::nullopt;
}
 
auto type = parse<ValueType>(is);
auto type = ValueType::parse(is);
if (!type) {
return std::nullopt;
}
@@ -214,6 +191,33 @@ std::optional<std::string> get_section_data(std::vector<Section> const &sections
 
} // namespace
 
// https://webassembly.github.io/spec/core/binary/types.html
std::optional<ValueType> ValueType::parse(std::istream &is) {
std::uint8_t byte{};
if (!is.read(reinterpret_cast<char *>(&byte), sizeof(byte))) {
return std::nullopt;
}
 
switch (byte) {
case 0x7f:
return ValueType{Kind::Int32};
case 0x7e:
return ValueType{Kind::Int64};
case 0x7d:
return ValueType{Kind::Float32};
case 0x7c:
return ValueType{Kind::Float64};
case 0x7b:
return ValueType{Kind::Vector128};
case 0x70:
return ValueType{Kind::FunctionReference};
case 0x6f:
return ValueType{Kind::ExternReference};
default:
return std::nullopt;
}
}
 
tl::expected<Module, ParseError> Module::parse_from(std::istream &is) {
std::string buf;
 
 
wasm/wasm.h added: 68, removed: 54, total 14
@@ -43,19 +43,27 @@ struct Section {
};
 
// https://webassembly.github.io/spec/core/syntax/types.html
enum class ValueType : std::uint8_t {
// Number types.
Int32,
Int64,
Float32,
Float64,
struct ValueType {
enum Kind : std::uint8_t {
// Number types.
Int32,
Int64,
Float32,
Float64,
 
// Vector types.
Vector128,
// Vector types.
Vector128,
 
// Reference types.
FunctionReference,
ExternReference,
// Reference types.
FunctionReference,
ExternReference,
};
 
static std::optional<ValueType> parse(std::istream &);
 
Kind kind{};
 
[[nodiscard]] bool operator==(ValueType const &) const = default;
};
 
// https://webassembly.github.io/spec/core/binary/types.html#result-types
 
wasm/wasm_example.cpp added: 68, removed: 54, total 14
@@ -13,7 +13,7 @@
namespace wasm {
std::ostream &operator<<(std::ostream &, wasm::ValueType);
std::ostream &operator<<(std::ostream &os, wasm::ValueType type) {
switch (type) {
switch (type.kind) {
case ValueType::Int32:
os << "i32";
break;
 
wasm/wasm_test.cpp added: 68, removed: 54, total 14
@@ -224,10 +224,11 @@ void type_section_tests() {
expect_eq(module.type_section(),
wasm::TypeSection{
.types{
wasm::FunctionType{.results{wasm::ValueType::Int32}},
wasm::FunctionType{.results{wasm::ValueType{wasm::ValueType::Int32}}},
wasm::FunctionType{
.parameters{wasm::ValueType::Int32, wasm::ValueType::Int32},
.results{wasm::ValueType::Float64},
.parameters{wasm::ValueType{wasm::ValueType::Int32},
wasm::ValueType{wasm::ValueType::Int32}},
.results{wasm::ValueType{wasm::ValueType::Float64}},
},
},
});
@@ -244,13 +245,13 @@ void type_section_tests() {
.types{
wasm::FunctionType{
.parameters{
wasm::ValueType::Int32,
wasm::ValueType::Int64,
wasm::ValueType::Float32,
wasm::ValueType::Float64,
wasm::ValueType::Vector128,
wasm::ValueType::FunctionReference,
wasm::ValueType::ExternReference,
wasm::ValueType{wasm::ValueType::Int32},
wasm::ValueType{wasm::ValueType::Int64},
wasm::ValueType{wasm::ValueType::Float32},
wasm::ValueType{wasm::ValueType::Float64},
wasm::ValueType{wasm::ValueType::Vector128},
wasm::ValueType{wasm::ValueType::FunctionReference},
wasm::ValueType{wasm::ValueType::ExternReference},
},
},
},
@@ -336,7 +337,7 @@ void code_section_tests() {
wasm::CodeSection expected{.entries{
wasm::CodeEntry{
.code{4, 4, 4},
.locals{{1, wasm::ValueType::Int32}},
.locals{{1, wasm::ValueType{wasm::ValueType::Int32}}},
},
}};
expect_eq(module.code_section(), expected);
@@ -351,11 +352,12 @@ void code_section_tests() {
wasm::CodeSection expected{.entries{
wasm::CodeEntry{
.code{4, 4, 4},
.locals{{1, wasm::ValueType::Int32}},
.locals{{1, wasm::ValueType{wasm::ValueType::Int32}}},
},
wasm::CodeEntry{
.code{7, 8, 9, 10},
.locals{{5, wasm::ValueType::Int64}, {6, wasm::ValueType::Float32}},
.locals{{5, wasm::ValueType{wasm::ValueType::Int64}},
{6, wasm::ValueType{wasm::ValueType::Float32}}},
},
}};
expect_eq(module.code_section(), expected);