diff options
Diffstat (limited to 'src/parser')
-rw-r--r-- | src/parser/contexts.h | 44 | ||||
-rw-r--r-- | src/parser/parsers.h | 29 |
2 files changed, 67 insertions, 6 deletions
diff --git a/src/parser/contexts.h b/src/parser/contexts.h index 396b115bf..7ce5bbf96 100644 --- a/src/parser/contexts.h +++ b/src/parser/contexts.h @@ -411,6 +411,12 @@ struct NullInstrParserCtx { Result<> makeRefIsNull(Index) { return Ok{}; } Result<> makeRefFunc(Index, FuncIdxT) { return Ok{}; } Result<> makeRefEq(Index) { return Ok{}; } + Result<> makeTableGet(Index, TableIdxT*) { return Ok{}; } + Result<> makeTableSet(Index, TableIdxT*) { return Ok{}; } + Result<> makeTableSize(Index, TableIdxT*) { return Ok{}; } + Result<> makeTableGrow(Index, TableIdxT*) { return Ok{}; } + Result<> makeTableFill(Index, TableIdxT*) { return Ok{}; } + Result<> makeTableCopy(Index, TableIdxT*, TableIdxT*) { return Ok{}; } Result<> makeThrow(Index, TagIdxT) { return Ok{}; } template<typename HeapTypeT> Result<> makeCallRef(Index, HeapTypeT, bool) { return Ok{}; @@ -1524,6 +1530,44 @@ struct ParseDefsCtx : TypeParserCtx<ParseDefsCtx> { Result<> makeRefEq(Index pos) { return withLoc(pos, irBuilder.makeRefEq()); } + Result<> makeTableGet(Index pos, Name* table) { + auto t = getTable(pos, table); + CHECK_ERR(t); + return withLoc(pos, irBuilder.makeTableGet(*t)); + } + + Result<> makeTableSet(Index pos, Name* table) { + auto t = getTable(pos, table); + CHECK_ERR(t); + return withLoc(pos, irBuilder.makeTableSet(*t)); + } + + Result<> makeTableSize(Index pos, Name* table) { + auto t = getTable(pos, table); + CHECK_ERR(t); + return withLoc(pos, irBuilder.makeTableSize(*t)); + } + + Result<> makeTableGrow(Index pos, Name* table) { + auto t = getTable(pos, table); + CHECK_ERR(t); + return withLoc(pos, irBuilder.makeTableGrow(*t)); + } + + Result<> makeTableFill(Index pos, Name* table) { + auto t = getTable(pos, table); + CHECK_ERR(t); + return withLoc(pos, irBuilder.makeTableFill(*t)); + } + + Result<> makeTableCopy(Index pos, Name* destTable, Name* srcTable) { + auto dest = getTable(pos, destTable); + CHECK_ERR(dest); + auto src = getTable(pos, srcTable); + CHECK_ERR(src); + return withLoc(pos, irBuilder.makeTableCopy(*dest, *src)); + } + Result<> makeThrow(Index pos, Name tag) { return withLoc(pos, irBuilder.makeThrow(tag)); } diff --git a/src/parser/parsers.h b/src/parser/parsers.h index 281980108..67bd8bddd 100644 --- a/src/parser/parsers.h +++ b/src/parser/parsers.h @@ -1433,27 +1433,44 @@ template<typename Ctx> Result<> makeRefEq(Ctx& ctx, Index pos) { } template<typename Ctx> Result<> makeTableGet(Ctx& ctx, Index pos) { - return ctx.in.err("unimplemented instruction"); + auto table = maybeTableidx(ctx); + CHECK_ERR(table); + return ctx.makeTableGet(pos, table.getPtr()); } template<typename Ctx> Result<> makeTableSet(Ctx& ctx, Index pos) { - return ctx.in.err("unimplemented instruction"); + auto table = maybeTableidx(ctx); + CHECK_ERR(table); + return ctx.makeTableSet(pos, table.getPtr()); } template<typename Ctx> Result<> makeTableSize(Ctx& ctx, Index pos) { - return ctx.in.err("unimplemented instruction"); + auto table = maybeTableidx(ctx); + CHECK_ERR(table); + return ctx.makeTableSize(pos, table.getPtr()); } template<typename Ctx> Result<> makeTableGrow(Ctx& ctx, Index pos) { - return ctx.in.err("unimplemented instruction"); + auto table = maybeTableidx(ctx); + CHECK_ERR(table); + return ctx.makeTableGrow(pos, table.getPtr()); } template<typename Ctx> Result<> makeTableFill(Ctx& ctx, Index pos) { - return ctx.in.err("unimplemented instruction"); + auto table = maybeTableidx(ctx); + CHECK_ERR(table); + return ctx.makeTableFill(pos, table.getPtr()); } template<typename Ctx> Result<> makeTableCopy(Ctx& ctx, Index pos) { - return ctx.in.err("unimplemented instruction"); + auto destTable = maybeTableidx(ctx); + CHECK_ERR(destTable); + auto srcTable = maybeTableidx(ctx); + CHECK_ERR(srcTable); + if (destTable && !srcTable) { + return ctx.in.err("expected table index or identifier"); + } + return ctx.makeTableCopy(pos, destTable.getPtr(), srcTable.getPtr()); } template<typename Ctx> Result<> makeThrow(Ctx& ctx, Index pos) { |