From 7df80050b6e5f3aa449da95b28a1d3e7eb778cb3 Mon Sep 17 00:00:00 2001 From: Thomas Lively Date: Mon, 14 Nov 2022 13:44:24 -0800 Subject: [Parser] Parse `ref.is*`, `ref.eq`, `i31.new`, and `i31.get*` (#5247) --- src/wasm/wat-parser.cpp | 40 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 36 insertions(+), 4 deletions(-) (limited to 'src/wasm/wat-parser.cpp') 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 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 { 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 makeRefNull(Ctx& ctx, Index pos) { template Result makeRefIs(Ctx& ctx, Index pos, RefIsOp op) { - return ctx.in.err("unimplemented instruction"); + return ctx.makeRefIs(pos, op); } template @@ -2767,7 +2799,7 @@ Result makeRefFunc(Ctx& ctx, Index pos) { template Result makeRefEq(Ctx& ctx, Index pos) { - return ctx.in.err("unimplemented instruction"); + return ctx.makeRefEq(pos); } template @@ -2828,12 +2860,12 @@ Result makeCallRef(Ctx& ctx, Index pos, bool isReturn) { template Result makeI31New(Ctx& ctx, Index pos) { - return ctx.in.err("unimplemented instruction"); + return ctx.makeI31New(pos); } template Result makeI31Get(Ctx& ctx, Index pos, bool signed_) { - return ctx.in.err("unimplemented instruction"); + return ctx.makeI31Get(pos, signed_); } template -- cgit v1.2.3