summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/parser/context-defs.cpp10
-rw-r--r--src/parser/contexts.h5
-rw-r--r--src/parser/wat-parser.cpp8
-rw-r--r--src/wasm/wasm-ir-builder.cpp4
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;