summaryrefslogtreecommitdiff
path: root/src/wasm/wat-parser.cpp
diff options
context:
space:
mode:
authorThomas Lively <tlively@google.com>2022-11-14 13:44:24 -0800
committerGitHub <noreply@github.com>2022-11-14 21:44:24 +0000
commit7df80050b6e5f3aa449da95b28a1d3e7eb778cb3 (patch)
tree5a15339466c4e6d3eb56bce7a0acf37db38202ec /src/wasm/wat-parser.cpp
parent127a8929149f3cbf1e472a04e582983b93ba9aab (diff)
downloadbinaryen-7df80050b6e5f3aa449da95b28a1d3e7eb778cb3.tar.gz
binaryen-7df80050b6e5f3aa449da95b28a1d3e7eb778cb3.tar.bz2
binaryen-7df80050b6e5f3aa449da95b28a1d3e7eb778cb3.zip
[Parser] Parse `ref.is*`, `ref.eq`, `i31.new`, and `i31.get*` (#5247)
Diffstat (limited to 'src/wasm/wat-parser.cpp')
-rw-r--r--src/wasm/wat-parser.cpp40
1 files changed, 36 insertions, 4 deletions
diff --git a/src/wasm/wat-parser.cpp b/src/wasm/wat-parser.cpp
index 7705c9e5c..fe8b7a2cb 100644
--- a/src/wasm/wat-parser.cpp
+++ b/src/wasm/wat-parser.cpp
@@ -729,6 +729,12 @@ struct NullInstrParserCtx {
template<typename HeapTypeT> InstrT makeRefNull(Index, HeapTypeT) {
return {};
}
+ InstrT makeRefIs(Index, RefIsOp) { return Ok{}; }
+
+ InstrT makeRefEq(Index) { return Ok{}; }
+
+ InstrT makeI31New(Index) { return Ok{}; }
+ InstrT makeI31Get(Index, bool) { return Ok{}; }
};
// Phase 1: Parse definition spans for top-level module elements and determine
@@ -1764,6 +1770,32 @@ struct ParseDefsCtx : TypeParserCtx<ParseDefsCtx> {
Result<> makeRefNull(Index pos, HeapType type) {
return push(pos, builder.makeRefNull(type));
}
+
+ Result<> makeRefIs(Index pos, RefIsOp op) {
+ auto ref = pop(pos);
+ CHECK_ERR(ref);
+ return push(pos, builder.makeRefIs(op, *ref));
+ }
+
+ Result<> makeRefEq(Index pos) {
+ auto rhs = pop(pos);
+ CHECK_ERR(rhs);
+ auto lhs = pop(pos);
+ CHECK_ERR(lhs);
+ return push(pos, builder.makeRefEq(*lhs, *rhs));
+ }
+
+ Result<> makeI31New(Index pos) {
+ auto val = pop(pos);
+ CHECK_ERR(val);
+ return push(pos, builder.makeI31New(*val));
+ }
+
+ Result<> makeI31Get(Index pos, bool signed_) {
+ auto val = pop(pos);
+ CHECK_ERR(val);
+ return push(pos, builder.makeI31Get(*val, signed_));
+ }
};
// ================
@@ -2757,7 +2789,7 @@ Result<typename Ctx::InstrT> makeRefNull(Ctx& ctx, Index pos) {
template<typename Ctx>
Result<typename Ctx::InstrT> makeRefIs(Ctx& ctx, Index pos, RefIsOp op) {
- return ctx.in.err("unimplemented instruction");
+ return ctx.makeRefIs(pos, op);
}
template<typename Ctx>
@@ -2767,7 +2799,7 @@ Result<typename Ctx::InstrT> makeRefFunc(Ctx& ctx, Index pos) {
template<typename Ctx>
Result<typename Ctx::InstrT> makeRefEq(Ctx& ctx, Index pos) {
- return ctx.in.err("unimplemented instruction");
+ return ctx.makeRefEq(pos);
}
template<typename Ctx>
@@ -2828,12 +2860,12 @@ Result<typename Ctx::InstrT> makeCallRef(Ctx& ctx, Index pos, bool isReturn) {
template<typename Ctx>
Result<typename Ctx::InstrT> makeI31New(Ctx& ctx, Index pos) {
- return ctx.in.err("unimplemented instruction");
+ return ctx.makeI31New(pos);
}
template<typename Ctx>
Result<typename Ctx::InstrT> makeI31Get(Ctx& ctx, Index pos, bool signed_) {
- return ctx.in.err("unimplemented instruction");
+ return ctx.makeI31Get(pos, signed_);
}
template<typename Ctx>