I managed to create this file: import wasm3 # import wasm3/wasm3c proc wasmSize*(_: typedesc[array]): uint32 = uint32 sizeof(uint32) proc wasmSize*(_: typedesc[seq]): uint32 = uint32 sizeof(uint32) proc wasmSize*(_: typedesc[pointer]): uint32 = uint32 sizeof(pointer) proc wasmCopy(pt: ptr seq[uint8], env: WasmEnv, dest: WasmPtr, offset: var uint64) proc wasmAlloc*[T](oa: openArray[T], env: WasmEnv, wPtr: WasmPtr) = const elemSize = uint32 getWasmSize(typeof(oa[0])) var dataPtr = env.alloc(elemSize * uint32 oa.len) env.setMem(uint32(oa.len), wPtr) env.setMem(dataPtr, wPtr, offset = uint64 sizeof(int32)) var offset = 0u64 for element in oa: element.wasmCopy(env, dataPtr, offset) proc wasmCopy(pt: ptr seq[uint8], env: WasmEnv, dest: WasmPtr, offset: var uint64) = let ptrptr = env.alloc(uint32 sizeof(WasmPtr)) wasmAlloc(pt[], env, ptrptr) env.copyMem(dest.uint32, ptrptr.unsafeaddr, sizeof(WasmPtr), uint32 offset) Run
Although I haven’t tested it yet, I feel like something will go wrong