diff options
Diffstat (limited to 'src/parser/parsers.h')
-rw-r--r-- | src/parser/parsers.h | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/src/parser/parsers.h b/src/parser/parsers.h index c7b9168b1..d62645441 100644 --- a/src/parser/parsers.h +++ b/src/parser/parsers.h @@ -202,6 +202,7 @@ template<typename Ctx> MaybeResult<> table(Ctx&); template<typename Ctx> MaybeResult<> memory(Ctx&); template<typename Ctx> MaybeResult<> global(Ctx&); template<typename Ctx> MaybeResult<> export_(Ctx&); +template<typename Ctx> MaybeResult<> start(Ctx&); template<typename Ctx> MaybeResult<typename Ctx::ExprT> maybeElemexpr(Ctx&); template<typename Ctx> Result<typename Ctx::ElemListT> elemlist(Ctx&, bool); template<typename Ctx> MaybeResult<> elem(Ctx&); @@ -2648,6 +2649,23 @@ template<typename Ctx> MaybeResult<> export_(Ctx& ctx) { return Ok{}; } +// start ::= '(' 'start' funcidx ')' +template<typename Ctx> MaybeResult<> start(Ctx& ctx) { + auto pos = ctx.in.getPos(); + if (!ctx.in.takeSExprStart("start"sv)) { + return {}; + } + auto func = funcidx(ctx); + CHECK_ERR(func); + + CHECK_ERR(ctx.addStart(*func, pos)); + + if (!ctx.in.takeRParen()) { + return ctx.in.err("expected end of start declaration"); + } + return Ok{}; +} + // elemexpr ::= '(' 'item' expr ')' | '(' instr ')' template<typename Ctx> MaybeResult<typename Ctx::ExprT> maybeElemexpr(Ctx& ctx) { @@ -2896,6 +2914,10 @@ template<typename Ctx> MaybeResult<> modulefield(Ctx& ctx) { CHECK_ERR(res); return Ok{}; } + if (auto res = start(ctx)) { + CHECK_ERR(res); + return Ok{}; + } if (auto res = elem(ctx)) { CHECK_ERR(res); return Ok{}; |