@@ -194,6 +194,7 @@ template<typename Ctx> MaybeResult<> func(Ctx&);
194194template <typename Ctx> MaybeResult<> table (Ctx&);
195195template <typename Ctx> MaybeResult<> memory (Ctx&);
196196template <typename Ctx> MaybeResult<> global (Ctx&);
197+ template <typename Ctx> MaybeResult<> export_ (Ctx&);
197198template <typename Ctx> MaybeResult<typename Ctx::ExprT> maybeElemexpr (Ctx&);
198199template <typename Ctx> Result<typename Ctx::ElemListT> elemlist (Ctx&, bool );
199200template <typename Ctx> MaybeResult<> elem (Ctx&);
@@ -2371,6 +2372,56 @@ template<typename Ctx> MaybeResult<> global(Ctx& ctx) {
23712372 return Ok{};
23722373}
23732374
2375+ // export ::= '(' 'export' nm:name exportdesc ')'
2376+ // exportdesc ::= '(' 'func' x:funcidx ')'
2377+ // | '(' 'table' x:tableidx ')'
2378+ // | '(' 'memory' x:memidx ')'
2379+ // | '(' 'global' x:globalidx ')'
2380+ // | '(' 'tag' x:tagidx ')'
2381+ template <typename Ctx> MaybeResult<> export_ (Ctx& ctx) {
2382+ auto pos = ctx.in .getPos ();
2383+ if (!ctx.in .takeSExprStart (" export" sv)) {
2384+ return {};
2385+ }
2386+
2387+ auto name = ctx.in .takeName ();
2388+ if (!name) {
2389+ return ctx.in .err (" expected export name" );
2390+ }
2391+
2392+ if (ctx.in .takeSExprStart (" func" sv)) {
2393+ auto idx = funcidx (ctx);
2394+ CHECK_ERR (idx);
2395+ CHECK_ERR (ctx.addExport (pos, *idx, *name, ExternalKind::Function));
2396+ } else if (ctx.in .takeSExprStart (" table" sv)) {
2397+ auto idx = tableidx (ctx);
2398+ CHECK_ERR (idx);
2399+ CHECK_ERR (ctx.addExport (pos, *idx, *name, ExternalKind::Table));
2400+ } else if (ctx.in .takeSExprStart (" memory" sv)) {
2401+ auto idx = memidx (ctx);
2402+ CHECK_ERR (idx);
2403+ CHECK_ERR (ctx.addExport (pos, *idx, *name, ExternalKind::Memory));
2404+ } else if (ctx.in .takeSExprStart (" global" sv)) {
2405+ auto idx = globalidx (ctx);
2406+ CHECK_ERR (idx);
2407+ CHECK_ERR (ctx.addExport (pos, *idx, *name, ExternalKind::Global));
2408+ } else if (ctx.in .takeSExprStart (" tag" sv)) {
2409+ auto idx = tagidx (ctx);
2410+ CHECK_ERR (idx);
2411+ CHECK_ERR (ctx.addExport (pos, *idx, *name, ExternalKind::Tag));
2412+ } else {
2413+ return ctx.in .err (" expected export description" );
2414+ }
2415+
2416+ if (!ctx.in .takeRParen ()) {
2417+ return ctx.in .err (" expected end of export description" );
2418+ }
2419+ if (!ctx.in .takeRParen ()) {
2420+ return ctx.in .err (" expected end of export" );
2421+ }
2422+ return Ok{};
2423+ }
2424+
23742425// elemexpr ::= '(' 'item' expr ')' | '(' instr ')'
23752426template <typename Ctx>
23762427MaybeResult<typename Ctx::ExprT> maybeElemexpr (Ctx& ctx) {
@@ -2611,6 +2662,10 @@ template<typename Ctx> MaybeResult<> modulefield(Ctx& ctx) {
26112662 CHECK_ERR (res);
26122663 return Ok{};
26132664 }
2665+ if (auto res = export_ (ctx)) {
2666+ CHECK_ERR (res);
2667+ return Ok{};
2668+ }
26142669 if (auto res = elem (ctx)) {
26152670 CHECK_ERR (res);
26162671 return Ok{};
0 commit comments