diff --git a/benchmarks/wasm/even_odd.wat b/benchmarks/wasm/even_odd.wat index 6f0f6ed3..27e10369 100644 --- a/benchmarks/wasm/even_odd.wat +++ b/benchmarks/wasm/even_odd.wat @@ -24,12 +24,8 @@ i32.add call 0) (func (;2;) (type 1) (result i32) - i32.const 0 + i32.const 13 call 1) (start 2) - (table (;0;) 1 1 funcref) (memory (;0;) 16) - (export "memory" (memory 0)) - (export "is_even" (func 0)) - (export "is_odd" (func 1)) - (export "real_main" (func 2))) +) diff --git a/src/main/scala/wasm/MiniWasm.scala b/src/main/scala/wasm/MiniWasm.scala index 116aac25..e9fec781 100644 --- a/src/main/scala/wasm/MiniWasm.scala +++ b/src/main/scala/wasm/MiniWasm.scala @@ -175,7 +175,8 @@ object Evaluator { stack: List[Value], frame: Frame, trail: List[Cont], - kont: Cont): Unit = { + kont: Cont) + (implicit retKont: Cont): Unit = { if (insts.isEmpty) return kont(stack) val inst = insts.head @@ -291,7 +292,7 @@ object Evaluator { println(s"br if rest $rest") eval(rest, newStack, frame, trail, kont) } - case Return => kont(stack) + case Return => retKont(stack) case Call(f) if frame.module.funcs(f).isInstanceOf[FuncDef] => val FuncDef(_, FuncBodyDef(ty, _, locals, body)) = frame.module.funcs(f) println(s"calling $f") @@ -303,7 +304,7 @@ object Evaluator { eval(rest, retStack.take(ty.out.size) ++ newStack, frame, trail, kont) // We push newK on the trail since function creates a new block to escape // (more or less like `return`) - eval(body, List(), newFrame, newK :: trail, newK) + eval(body, List(), newFrame, newK :: trail, newK)(newK) case Call(f) if frame.module.funcs(f).isInstanceOf[Import] => frame.module.funcs(f) match { case Import("console", "log", _) => diff --git a/src/test/scala/genwasym/TestEval.scala b/src/test/scala/genwasym/TestEval.scala index 1275d2b5..cfd8eb4d 100644 --- a/src/test/scala/genwasym/TestEval.scala +++ b/src/test/scala/genwasym/TestEval.scala @@ -93,8 +93,8 @@ class TestEval extends FunSuite { test("start") { testFile("./benchmarks/wasm/start.wat") } test("fact") { testFile("./benchmarks/wasm/fact.wat", None, Some(120)) } test("loop") { testFile("./benchmarks/wasm/loop.wat", None, Some(10)) } - // test("even-odd") { testFile("./benchmarks/wasm/even_odd.wat", None, Some(1)) } - // test("return") { testFile("./benchmarks/wasm/return.wat", None, None) } + test("even-odd") { testFile("./benchmarks/wasm/even_odd.wat", None, Some(1)) } + test("return") { testFile("./benchmarks/wasm/return.wat", None, None) } // Parser works, but the memory issue remains // test("btree") { testFile("./benchmarks/wasm/btree/2o1u-no-label-for-real.wat") }