summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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
-rw-r--r--test/lit/wat-kitchen-sink.wast4
5 files changed, 16 insertions, 15 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;
diff --git a/test/lit/wat-kitchen-sink.wast b/test/lit/wat-kitchen-sink.wast
index 32a70d913..7dea0d3c2 100644
--- a/test/lit/wat-kitchen-sink.wast
+++ b/test/lit/wat-kitchen-sink.wast
@@ -271,7 +271,7 @@
;; imported functions
(func (export "f5.0") (export "f5.1") (import "mod" "f5"))
- (import "mod" "imported-f" (func (param) (result)))
+ (import "mod" "imported-f" (func (param) (result i32 i64)))
;; imported tags
(tag $imported (export "t0.0") (export "t0.1") (import "mod" "t0") (param i32 i64))
@@ -283,7 +283,7 @@
;; CHECK: (import "mod" "f5" (func $fimport$0 (type $void)))
- ;; CHECK: (import "mod" "imported-f" (func $fimport$1 (type $void)))
+ ;; CHECK: (import "mod" "imported-f" (func $fimport$1 (type $3) (result i32 i64)))
;; CHECK: (import "mod" "t0" (tag $imported (param i32 i64)))