From 70b3d2328dede446615bf0777bfea6a50cf22b2b Mon Sep 17 00:00:00 2001 From: Guannan Wei Date: Mon, 14 Oct 2024 16:27:28 +0200 Subject: [PATCH] properly initializing local values --- src/main/scala/wasm/MiniWasm.scala | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/main/scala/wasm/MiniWasm.scala b/src/main/scala/wasm/MiniWasm.scala index 8efe0e12..a6319a4a 100644 --- a/src/main/scala/wasm/MiniWasm.scala +++ b/src/main/scala/wasm/MiniWasm.scala @@ -163,6 +163,17 @@ object Primtives { val memory = frame.module.memory(memoryIndex) offset + size > memory.size } + + def zero(t: ValueType): Value = t match { + case NumType(kind) => kind match { + case I32Type => I32V(0) + case I64Type => I64V(0) + case F32Type => F32V(0) + case F64Type => F64V(0) + } + case VecType(kind) => ??? + case RefType(kind) => ??? + } } case class Frame(module: ModuleInstance, locals: ArrayBuffer[Value]) @@ -298,7 +309,7 @@ object Evaluator { val FuncDef(_, FuncBodyDef(ty, _, locals, body)) = frame.module.funcs(f) val args = stack.take(ty.inps.size).reverse val newStack = stack.drop(ty.inps.size) - val frameLocals = args ++ locals.map(_ => I32V(0)) // GW: always I32? or depending on their types? + val frameLocals = args ++ locals.map(zero(_)) val newFrame = Frame(frame.module, ArrayBuffer(frameLocals: _*)) val newK: Cont[Ans] = (retStack) => eval(rest, retStack.take(ty.out.size) ++ newStack, frame, kont, trail, ret)