summaryrefslogtreecommitdiff
path: root/src/parser/parsers.h
diff options
context:
space:
mode:
authorThomas Lively <tlively@google.com>2024-01-30 15:13:40 -0800
committerGitHub <noreply@github.com>2024-01-30 15:13:40 -0800
commit8504571fb7209d07670a06c42a868bbfc954c756 (patch)
tree8431cd49e3f24794bff2488cd3491eea4dd824d7 /src/parser/parsers.h
parent8b85d5dfd22c56ea9a54df37219492ad3b6d5605 (diff)
downloadbinaryen-8504571fb7209d07670a06c42a868bbfc954c756.tar.gz
binaryen-8504571fb7209d07670a06c42a868bbfc954c756.tar.bz2
binaryen-8504571fb7209d07670a06c42a868bbfc954c756.zip
[Parser] Parse start declarations (#6256)
Diffstat (limited to 'src/parser/parsers.h')
-rw-r--r--src/parser/parsers.h22
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{};