diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/parser/contexts.h | 6 | ||||
-rw-r--r-- | src/parser/parsers.h | 8 |
2 files changed, 11 insertions, 3 deletions
diff --git a/src/parser/contexts.h b/src/parser/contexts.h index d68d475a0..81537abaf 100644 --- a/src/parser/contexts.h +++ b/src/parser/contexts.h @@ -173,6 +173,8 @@ struct NullTypeParserCtx { BlockTypeT getBlockTypeFromResult(size_t results) { return Ok{}; } Result<> getBlockTypeFromTypeUse(Index, TypeUseT) { return Ok{}; } + + bool skipFunctionBody() { return false; } }; template<typename Ctx> struct TypeParserCtx { @@ -310,6 +312,8 @@ template<typename Ctx> struct TypeParserCtx { assert(results.size() == 1); return HeapType(Signature(Type::none, results[0])); } + + bool skipFunctionBody() { return false; } }; struct NullInstrParserCtx { @@ -1198,6 +1202,8 @@ struct ParseModuleTypesCtx : TypeParserCtx<ParseModuleTypesCtx>, types(types), implicitTypes(implicitTypes), implicitElemIndices(implicitElemIndices) {} + bool skipFunctionBody() { return true; } + Result<HeapTypeT> getHeapTypeFromIdx(Index idx) { if (idx >= types.size()) { return in.err("type index out of bounds"); diff --git a/src/parser/parsers.h b/src/parser/parsers.h index bbb50b664..25078f354 100644 --- a/src/parser/parsers.h +++ b/src/parser/parsers.h @@ -3028,11 +3028,13 @@ template<typename Ctx> MaybeResult<> func(Ctx& ctx) { CHECK_ERR(l); localVars = *l; } - CHECK_ERR(instrs(ctx)); - ctx.setSrcLoc(ctx.in.takeAnnotations()); + if (!ctx.skipFunctionBody()) { + CHECK_ERR(instrs(ctx)); + ctx.setSrcLoc(ctx.in.takeAnnotations()); + } } - if (!ctx.in.takeRParen()) { + if (!ctx.skipFunctionBody() && !ctx.in.takeRParen()) { return ctx.in.err("expected end of function"); } |