summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorThomas Lively <tlively@google.com>2022-10-20 19:38:21 -0500
committerGitHub <noreply@github.com>2022-10-21 00:38:21 +0000
commit884fe9bcee0a7aa10a427d76bd317bb136258dc6 (patch)
treef26a2b9bcd38148eee4257ab715a4783818c0436 /src
parent7144c922f1cd19a4c55c603c7f57f224e9ec4975 (diff)
downloadbinaryen-884fe9bcee0a7aa10a427d76bd317bb136258dc6.tar.gz
binaryen-884fe9bcee0a7aa10a427d76bd317bb136258dc6.tar.bz2
binaryen-884fe9bcee0a7aa10a427d76bd317bb136258dc6.zip
[Parser] Parse shared memory declarations (#5173)
Diffstat (limited to 'src')
-rw-r--r--src/wasm/wat-parser.cpp32
-rw-r--r--src/wat-parser.h2
2 files changed, 20 insertions, 14 deletions
diff --git a/src/wasm/wat-parser.cpp b/src/wasm/wat-parser.cpp
index 6bfca9da6..1cc2623ca 100644
--- a/src/wasm/wat-parser.cpp
+++ b/src/wasm/wat-parser.cpp
@@ -332,6 +332,7 @@ struct Limits {
struct MemType {
Type type;
Limits limits;
+ bool shared;
};
// RAII utility for temporarily changing the parsing position of a parsing
@@ -483,8 +484,7 @@ struct NullTypeParserCtx {
LimitsT makeLimits(uint64_t, std::optional<uint64_t>) { return Ok{}; }
LimitsT getLimitsFromData(DataStringT) { return Ok{}; }
- MemTypeT makeMemType32(LimitsT) { return Ok{}; }
- MemTypeT makeMemType64(LimitsT) { return Ok{}; }
+ MemTypeT makeMemType(Type, LimitsT, bool) { return Ok{}; }
};
template<typename Ctx> struct TypeParserCtx {
@@ -600,8 +600,9 @@ template<typename Ctx> struct TypeParserCtx {
return {size, size};
}
- MemType makeMemType32(Limits limits) { return {Type::i32, limits}; }
- MemType makeMemType64(Limits limits) { return {Type::i64, limits}; }
+ MemType makeMemType(Type type, Limits limits, bool shared) {
+ return {type, limits, shared};
+ }
};
struct NullInstrParserCtx {
@@ -1235,8 +1236,7 @@ struct ParseModuleTypesCtx : TypeParserCtx<ParseModuleTypesCtx>,
m->indexType = type.type;
m->initial = type.limits.initial;
m->max = type.limits.max;
- // TODO: shared memories.
- m->shared = false;
+ m->shared = type.shared;
return Ok{};
}
@@ -2000,17 +2000,21 @@ template<typename Ctx> Result<typename Ctx::LimitsT> limits64(Ctx& ctx) {
return ctx.makeLimits(uint64_t(*n), m);
}
-// memtype ::= limits32 | 'i32' limits32 | 'i64' limit64
+// memtype ::= (limits32 | 'i32' limits32 | 'i64' limit64) shared?
template<typename Ctx> Result<typename Ctx::MemTypeT> memtype(Ctx& ctx) {
+ auto type = Type::i32;
if (ctx.in.takeKeyword("i64"sv)) {
- auto limits = limits64(ctx);
- CHECK_ERR(limits);
- return ctx.makeMemType64(*limits);
+ type = Type::i64;
+ } else {
+ ctx.in.takeKeyword("i32"sv);
}
- ctx.in.takeKeyword("i32"sv);
- auto limits = limits32(ctx);
+ auto limits = type == Type::i32 ? limits32(ctx) : limits64(ctx);
CHECK_ERR(limits);
- return ctx.makeMemType32(*limits);
+ bool shared = false;
+ if (ctx.in.takeKeyword("shared"sv)) {
+ shared = true;
+ }
+ return ctx.makeMemType(type, *limits, shared);
}
// globaltype ::= t:valtype => const t
@@ -2984,7 +2988,7 @@ template<typename Ctx> MaybeResult<> memory(Ctx& ctx) {
if (!ctx.in.takeRParen()) {
return ctx.in.err("expected end of inline data");
}
- mtype = ctx.makeMemType32(ctx.getLimitsFromData(*data));
+ mtype = ctx.makeMemType(Type::i32, ctx.getLimitsFromData(*data), false);
// TODO: addDataSegment as well.
} else {
auto type = memtype(ctx);
diff --git a/src/wat-parser.h b/src/wat-parser.h
index acbd96d44..ebeb566c4 100644
--- a/src/wat-parser.h
+++ b/src/wat-parser.h
@@ -35,6 +35,7 @@ template<typename T = Ok> struct Result {
std::variant<T, Err> val;
Result(Result<T>& other) = default;
+ Result(Result<T>&& other) = default;
Result(const Err& e) : val(std::in_place_type<Err>, e) {}
Result(Err&& e) : val(std::in_place_type<Err>, std::move(e)) {}
template<typename U = T>
@@ -50,6 +51,7 @@ template<typename T = Ok> struct MaybeResult {
MaybeResult() : val(None{}) {}
MaybeResult(MaybeResult<T>& other) = default;
+ MaybeResult(MaybeResult<T>&& other) = default;
MaybeResult(const Err& e) : val(std::in_place_type<Err>, e) {}
MaybeResult(Err&& e) : val(std::in_place_type<Err>, std::move(e)) {}
template<typename U = T>