diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/parser/context-defs.cpp | 10 | ||||
-rw-r--r-- | src/parser/contexts.h | 5 | ||||
-rw-r--r-- | src/parser/wat-parser.cpp | 8 | ||||
-rw-r--r-- | src/wasm/wasm-ir-builder.cpp | 4 |
4 files changed, 14 insertions, 13 deletions
diff --git a/src/parser/context-defs.cpp b/src/parser/context-defs.cpp index e5c598b6b..2d4d305ed 100644 --- a/src/parser/context-defs.cpp +++ b/src/parser/context-defs.cpp @@ -50,16 +50,6 @@ ParseDefsCtx::makeTypeUse(Index pos, return it->second; } -Result<> ParseDefsCtx::addFunc(Name, - const std::vector<Name>&, - ImportNames*, - TypeUseT, - std::optional<LocalsT>, - Index pos) { - CHECK_ERR(withLoc(pos, irBuilder.visitEnd())); - return Ok{}; -} - Result<> ParseDefsCtx::addGlobal(Name, const std::vector<Name>&, ImportNames*, diff --git a/src/parser/contexts.h b/src/parser/contexts.h index c14a555c5..5dd48bc59 100644 --- a/src/parser/contexts.h +++ b/src/parser/contexts.h @@ -1324,12 +1324,15 @@ struct ParseDefsCtx : TypeParserCtx<ParseDefsCtx> { std::optional<HeapTypeT> type, ParamsT* params, ResultsT* results); + Result<> addFunc(Name, const std::vector<Name>&, ImportNames*, TypeUseT, std::optional<LocalsT>, - Index pos); + Index) { + return Ok{}; + } Result<> addTable(Name, const std::vector<Name>&, ImportNames*, TableTypeT, Index) { diff --git a/src/parser/wat-parser.cpp b/src/parser/wat-parser.cpp index f247dbf48..50a47d7b6 100644 --- a/src/parser/wat-parser.cpp +++ b/src/parser/wat-parser.cpp @@ -177,7 +177,10 @@ Result<> parseModule(Module& wasm, std::string_view input) { for (Index i = 0; i < decls.funcDefs.size(); ++i) { ctx.index = i; - CHECK_ERR(ctx.visitFunctionStart(wasm.functions[i].get())); + auto* f = wasm.functions[i].get(); + if (!f->imported()) { + CHECK_ERR(ctx.visitFunctionStart(f)); + } WithPosition with(ctx, decls.funcDefs[i].pos); if (auto parsed = func(ctx)) { CHECK_ERR(parsed); @@ -186,6 +189,9 @@ Result<> parseModule(Module& wasm, std::string_view input) { assert(im); CHECK_ERR(im); } + if (!f->imported()) { + CHECK_ERR(ctx.irBuilder.visitEnd()); + } } // Parse exports. diff --git a/src/wasm/wasm-ir-builder.cpp b/src/wasm/wasm-ir-builder.cpp index 8098856e4..bf3c38c1e 100644 --- a/src/wasm/wasm-ir-builder.cpp +++ b/src/wasm/wasm-ir-builder.cpp @@ -162,7 +162,6 @@ Result<Expression*> IRBuilder::pop(size_t size) { // Find the suffix of expressions that do not produce values. auto hoisted = hoistLastValue(); CHECK_ERR(hoisted); - if (!hoisted) { // There are no expressions that produce values. if (scope.unreachable) { @@ -700,6 +699,9 @@ Result<Expression*> IRBuilder::finishScope(Block* block) { // the top. auto hoisted = hoistLastValue(); CHECK_ERR(hoisted); + if (!hoisted) { + return Err{"popping from empty stack"}; + } } Expression* ret = nullptr; |