summaryrefslogtreecommitdiff
path: root/src/parser
diff options
context:
space:
mode:
Diffstat (limited to 'src/parser')
-rw-r--r--src/parser/contexts.h44
-rw-r--r--src/parser/parsers.h29
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) {