summaryrefslogtreecommitdiff
path: root/src/parser/contexts.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/parser/contexts.h')
-rw-r--r--src/parser/contexts.h21
1 files changed, 21 insertions, 0 deletions
diff --git a/src/parser/contexts.h b/src/parser/contexts.h
index 8395f4dc4..396b115bf 100644
--- a/src/parser/contexts.h
+++ b/src/parser/contexts.h
@@ -396,6 +396,10 @@ struct NullInstrParserCtx {
Result<> makeMemoryCopy(Index, MemoryIdxT*, MemoryIdxT*) { return Ok{}; }
Result<> makeMemoryFill(Index, MemoryIdxT*) { return Ok{}; }
Result<> makeCall(Index, FuncIdxT, bool) { return Ok{}; }
+ template<typename TypeUseT>
+ Result<> makeCallIndirect(Index, TableIdxT*, TypeUseT, bool) {
+ return Ok{};
+ }
Result<> makeBreak(Index, LabelIdxT) { return Ok{}; }
Result<> makeSwitch(Index, const std::vector<LabelIdxT>&, LabelIdxT) {
return Ok{};
@@ -1217,6 +1221,16 @@ struct ParseDefsCtx : TypeParserCtx<ParseDefsCtx> {
Memarg getMemarg(uint64_t offset, uint32_t align) { return {offset, align}; }
+ Result<Name> getTable(Index pos, Name* table) {
+ if (table) {
+ return *table;
+ }
+ if (wasm.tables.empty()) {
+ return in.err(pos, "table required, but there is no table");
+ }
+ return wasm.tables[0]->name;
+ }
+
Result<Name> getMemory(Index pos, Name* mem) {
if (mem) {
return *mem;
@@ -1476,6 +1490,13 @@ struct ParseDefsCtx : TypeParserCtx<ParseDefsCtx> {
return withLoc(pos, irBuilder.makeCall(func, isReturn));
}
+ Result<>
+ makeCallIndirect(Index pos, Name* table, HeapType type, bool isReturn) {
+ auto t = getTable(pos, table);
+ CHECK_ERR(t);
+ return withLoc(pos, irBuilder.makeCallIndirect(*t, type, isReturn));
+ }
+
Result<> makeBreak(Index pos, Index label) {
return withLoc(pos, irBuilder.makeBreak(label));
}