summaryrefslogtreecommitdiff
path: root/src/parser/parsers.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/parser/parsers.h')
-rw-r--r--src/parser/parsers.h21
1 files changed, 18 insertions, 3 deletions
diff --git a/src/parser/parsers.h b/src/parser/parsers.h
index 3a4f9c212..7ac25def4 100644
--- a/src/parser/parsers.h
+++ b/src/parser/parsers.h
@@ -173,6 +173,7 @@ template<typename Ctx> MaybeResult<Index> maybeTypeidx(Ctx& ctx);
template<typename Ctx> Result<typename Ctx::HeapTypeT> typeidx(Ctx&);
template<typename Ctx>
Result<typename Ctx::FieldIdxT> fieldidx(Ctx&, typename Ctx::HeapTypeT);
+template<typename Ctx> Result<typename Ctx::FuncIdxT> funcidx(Ctx&);
template<typename Ctx> MaybeResult<typename Ctx::MemoryIdxT> maybeMemidx(Ctx&);
template<typename Ctx> Result<typename Ctx::MemoryIdxT> memidx(Ctx&);
template<typename Ctx> MaybeResult<typename Ctx::MemoryIdxT> maybeMemuse(Ctx&);
@@ -1205,7 +1206,9 @@ template<typename Ctx> Result<> makeLoop(Ctx& ctx, Index pos) {
}
template<typename Ctx> Result<> makeCall(Ctx& ctx, Index pos, bool isReturn) {
- return ctx.in.err("unimplemented instruction");
+ auto func = funcidx(ctx);
+ CHECK_ERR(func);
+ return ctx.makeCall(pos, *func, isReturn);
}
template<typename Ctx>
@@ -1509,8 +1512,8 @@ template<typename Ctx> Result<typename Ctx::HeapTypeT> typeidx(Ctx& ctx) {
return ctx.in.err("expected type index or identifier");
}
-// fieldidx_t ::= x:u32 => x
-// | v:id => x (if t.fields[x] = v)
+// fieldidx ::= x:u32 => x
+// | v:id => x (if t.fields[x] = v)
template<typename Ctx>
Result<typename Ctx::FieldIdxT> fieldidx(Ctx& ctx,
typename Ctx::HeapTypeT type) {
@@ -1523,6 +1526,18 @@ Result<typename Ctx::FieldIdxT> fieldidx(Ctx& ctx,
return ctx.in.err("expected field index or identifier");
}
+// funcidx ::= x:u32 => x
+// | v:id => x (if t.funcs[x] = v)
+template<typename Ctx> Result<typename Ctx::FuncIdxT> funcidx(Ctx& ctx) {
+ if (auto x = ctx.in.takeU32()) {
+ return ctx.getFuncFromIdx(*x);
+ }
+ if (auto id = ctx.in.takeID()) {
+ return ctx.getFuncFromName(*id);
+ }
+ return ctx.in.err("expected function index or identifier");
+}
+
// memidx ::= x:u32 => x
// | v:id => x (if memories[x] = v)
template<typename Ctx>