From a1cfd4aef9c875ddce3bf85364dbbbfbbff86a34 Mon Sep 17 00:00:00 2001 From: Geraint Date: Tue, 13 Jan 2026 23:35:38 +0000 Subject: [PATCH 1/3] Let binaryen split our memory data up --- src/compiler.ts | 5 +++++ src/module.ts | 14 ++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/src/compiler.ts b/src/compiler.ts index 36f09ab8aa..8e4550cf18 100644 --- a/src/compiler.ts +++ b/src/compiler.ts @@ -831,6 +831,11 @@ export class Compiler extends DiagnosticEmitter { } } + if (options.willOptimize) { + // Binaryen will split this up more efficiently + memorySegments = module.combineMemorySegments(memorySegments); + } + // Setup internal memory with default name "0" module.setMemory( initialPages, diff --git a/src/module.ts b/src/module.ts index 2719f60c50..16083e85b4 100644 --- a/src/module.ts +++ b/src/module.ts @@ -2337,6 +2337,20 @@ export class Module { /** Unlimited memory constant. */ static readonly UNLIMITED_MEMORY: Index = -1; + combineMemorySegments( + segments: MemorySegment[] + ) : MemorySegment[] { + if (!segments.length) return segments; + segments = segments.slice(0); + let lastSegment = segments[segments.length - 1]; + let length = u32(lastSegment.offset) + lastSegment.buffer.length; + let newBuffer = new Uint8Array(u32(length)); + segments.forEach(segment => { + newBuffer.set(segment.buffer, u32(segment.offset)); + }); + return [new MemorySegment(newBuffer, i64_new(0))]; + } + setMemory( initial: Index, maximum: Index, From 6006c0b43c135ff09b7bd8c1a85f284412a7a6b9 Mon Sep 17 00:00:00 2001 From: Geraint Date: Tue, 13 Jan 2026 23:50:24 +0000 Subject: [PATCH 2/3] No `.forEach()`, for WASM compatibility --- src/module.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/module.ts b/src/module.ts index 16083e85b4..3ff484946d 100644 --- a/src/module.ts +++ b/src/module.ts @@ -2345,9 +2345,11 @@ export class Module { let lastSegment = segments[segments.length - 1]; let length = u32(lastSegment.offset) + lastSegment.buffer.length; let newBuffer = new Uint8Array(u32(length)); - segments.forEach(segment => { + let k = segments.length; + for (let i = 0; i < k; ++i) { + let segment = unchecked(segments[i]); newBuffer.set(segment.buffer, u32(segment.offset)); - }); + } return [new MemorySegment(newBuffer, i64_new(0))]; } From 4b97d91e06c17cb46f360504e2092fd556efefc4 Mon Sep 17 00:00:00 2001 From: Geraint Date: Tue, 13 Jan 2026 12:28:57 +0000 Subject: [PATCH 3/3] Add to `NOTICE` --- NOTICE | 1 + 1 file changed, 1 insertion(+) diff --git a/NOTICE b/NOTICE index 14d821345c..cd28e9fd96 100644 --- a/NOTICE +++ b/NOTICE @@ -62,6 +62,7 @@ under the licensing terms detailed in LICENSE: * Kam Chehresa * Mopsgamer <79159094+Mopsgamer@users.noreply.github.com> * EDM115 +* Geraint Luff Portions of this software are derived from third-party works licensed under the following terms: