summaryrefslogtreecommitdiff
path: root/src/parser
diff options
context:
space:
mode:
Diffstat (limited to 'src/parser')
-rw-r--r--src/parser/contexts.h11
-rw-r--r--src/parser/parsers.h10
2 files changed, 19 insertions, 2 deletions
diff --git a/src/parser/contexts.h b/src/parser/contexts.h
index bf6c291e7..4147f7bda 100644
--- a/src/parser/contexts.h
+++ b/src/parser/contexts.h
@@ -398,6 +398,12 @@ struct NullInstrParserCtx {
template<typename TypeT> Result<> makeRefTest(Index, TypeT) { return Ok{}; }
template<typename TypeT> Result<> makeRefCast(Index, TypeT) { return Ok{}; }
+ Result<> makeBrOn(Index, LabelIdxT, BrOnOp) { return Ok{}; }
+
+ template<typename TypeT> Result<> makeBrOn(Index, LabelIdxT, BrOnOp, TypeT) {
+ return Ok{};
+ }
+
template<typename HeapTypeT> Result<> makeStructNew(Index, HeapTypeT) {
return Ok{};
}
@@ -1290,6 +1296,11 @@ struct ParseDefsCtx : TypeParserCtx<ParseDefsCtx> {
return withLoc(pos, irBuilder.makeRefCast(type));
}
+ Result<>
+ makeBrOn(Index pos, Index label, BrOnOp op, Type castType = Type::none) {
+ return withLoc(pos, irBuilder.makeBrOn(label, op, castType));
+ }
+
Result<> makeStructNew(Index pos, HeapType type) {
return withLoc(pos, irBuilder.makeStructNew(type));
}
diff --git a/src/parser/parsers.h b/src/parser/parsers.h
index 6b6bb0aa5..e2fb3732a 100644
--- a/src/parser/parsers.h
+++ b/src/parser/parsers.h
@@ -1315,11 +1315,17 @@ template<typename Ctx> Result<> makeRefCast(Ctx& ctx, Index pos) {
}
template<typename Ctx> Result<> makeBrOnNull(Ctx& ctx, Index pos, bool onFail) {
- return ctx.in.err("unimplemented instruction");
+ auto label = labelidx(ctx);
+ CHECK_ERR(label);
+ return ctx.makeBrOn(pos, *label, onFail ? BrOnNonNull : BrOnNull);
}
template<typename Ctx> Result<> makeBrOnCast(Ctx& ctx, Index pos, bool onFail) {
- return ctx.in.err("unimplemented instruction");
+ auto label = labelidx(ctx);
+ CHECK_ERR(label);
+ auto type = reftype(ctx);
+ CHECK_ERR(type);
+ return ctx.makeBrOn(pos, *label, onFail ? BrOnCastFail : BrOnCast, *type);
}
template<typename Ctx>