From a3e684a60fc3805875341266f14d359bd329d579 Mon Sep 17 00:00:00 2001 From: Junior Rojas Date: Tue, 17 Mar 2026 22:44:58 -0700 Subject: [PATCH 1/4] Update memory management utils --- algovivo/mmgrten/Engine.js | 2 +- algovivo/mmgrten/mmgr/MemoryManager.js | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/algovivo/mmgrten/Engine.js b/algovivo/mmgrten/Engine.js index d4806da4..2170bba7 100644 --- a/algovivo/mmgrten/Engine.js +++ b/algovivo/mmgrten/Engine.js @@ -16,7 +16,7 @@ class Engine { } this.wasmInstance = args.wasmInstance; const arr = args.wasmInstance.exports.memory.buffer; - const mgr = new mmgr.MemoryManager(arr, args.wasmInstance.exports.__heap_base); + const mgr = new mmgr.MemoryManager(arr, Number(args.wasmInstance.exports.__heap_base)); this.mgr = mgr; this.functional = this.F = new Functional({ diff --git a/algovivo/mmgrten/mmgr/MemoryManager.js b/algovivo/mmgrten/mmgr/MemoryManager.js index 618b38dc..ce6b9206 100644 --- a/algovivo/mmgrten/mmgr/MemoryManager.js +++ b/algovivo/mmgrten/mmgr/MemoryManager.js @@ -121,6 +121,10 @@ class MemoryManager { free(ptr) { const slot = this.ptrToSlot.get(ptr); + if (slot == null) { + throw new Error(`no slot found for ptr ${ptr}`); + } + this.ptrToSlot.delete(ptr); slot.free(); } } From a2db24749bbbb005511482e4c67169397f72efef Mon Sep 17 00:00:00 2001 From: Junior Rojas Date: Tue, 17 Mar 2026 22:46:43 -0700 Subject: [PATCH 2/4] Add mmgr test --- test/mmgrten.test.js | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 test/mmgrten.test.js diff --git a/test/mmgrten.test.js b/test/mmgrten.test.js new file mode 100644 index 00000000..d532a49e --- /dev/null +++ b/test/mmgrten.test.js @@ -0,0 +1,14 @@ +const algovivo = require("algovivo"); + +test("malloc free with non-numeric heapBase", () => { + // simulate WebAssembly.Global which has valueOf() but is an object + const heapBase = { valueOf: () => 16 }; + const buffer = new ArrayBuffer(1024); + const mgr = new algovivo.mmgrten.mmgr.MemoryManager(buffer, heapBase); + + const ptr = mgr.malloc(32); + // WASM receives ptr coerced to i32, then passes it back as a number + const numericPtr = Number(ptr); + // this is what the WASM free import does + mgr.free(numericPtr); +}); From ea714da3c63c34be56fc951486803bcadd053854 Mon Sep 17 00:00:00 2001 From: Junior Rojas Date: Tue, 17 Mar 2026 22:48:45 -0700 Subject: [PATCH 3/4] Update MemoryManager --- algovivo/mmgrten/mmgr/MemoryManager.js | 1 + 1 file changed, 1 insertion(+) diff --git a/algovivo/mmgrten/mmgr/MemoryManager.js b/algovivo/mmgrten/mmgr/MemoryManager.js index ce6b9206..887a5496 100644 --- a/algovivo/mmgrten/mmgr/MemoryManager.js +++ b/algovivo/mmgrten/mmgr/MemoryManager.js @@ -6,6 +6,7 @@ class MemoryManager { this.array = array; if (heapBase == null) heapBase = 0; + else heapBase = Number(heapBase); this.ptrToSlot = new Map(); From b9c1ee947c649349ab3015115909eea092879a76 Mon Sep 17 00:00:00 2001 From: Junior Rojas Date: Tue, 17 Mar 2026 22:55:43 -0700 Subject: [PATCH 4/4] Update test --- test/{mmgrten.test.js => mmgr/memoryManager.test.js} | 2 -- 1 file changed, 2 deletions(-) rename test/{mmgrten.test.js => mmgr/memoryManager.test.js} (78%) diff --git a/test/mmgrten.test.js b/test/mmgr/memoryManager.test.js similarity index 78% rename from test/mmgrten.test.js rename to test/mmgr/memoryManager.test.js index d532a49e..200f0e3d 100644 --- a/test/mmgrten.test.js +++ b/test/mmgr/memoryManager.test.js @@ -7,8 +7,6 @@ test("malloc free with non-numeric heapBase", () => { const mgr = new algovivo.mmgrten.mmgr.MemoryManager(buffer, heapBase); const ptr = mgr.malloc(32); - // WASM receives ptr coerced to i32, then passes it back as a number const numericPtr = Number(ptr); - // this is what the WASM free import does mgr.free(numericPtr); });