Fix WASM memory view invalidation when memory grows#248
Open
Fix WASM memory view invalidation when memory grows#248
Conversation
When Emscripten's WASM memory grows (due to -sALLOW_MEMORY_GROWTH), all existing TypedArray views become detached because the underlying ArrayBuffer is replaced. This caused bugs where reading from views after FFI calls returned undefined values if memory had grown. The fix introduces RefreshableTypedArray, a wrapper that lazily recreates the TypedArray view when HEAPU8.buffer changes. This is a simple reference comparison that only triggers view recreation when actually needed. Affected call sites: - runtime.ts: executePendingJobs - reads ctxPtrOut after QTS_ExecutePendingJob - context.ts: newPromise - reads resolve/reject handles after QTS_NewPromiseCapability - context.ts: getLength - reads uint32Out after QTS_GetLength - context.ts: getOwnPropertyNames - reads outPtr and uint32Out after QTS_GetOwnPropertyNames Also fixed: getOwnPropertyNames was using HEAP8.buffer instead of HEAPU8.buffer Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
57ce055 to
48f9af3
Compare
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
When Emscripten's WASM memory grows (due to
-sALLOW_MEMORY_GROWTH), all existing TypedArray views become detached because the underlying ArrayBuffer is replaced. This caused bugs where reading from views after FFI calls returned undefined (in the C correctness sense) values if memory had grown during the call.The fix introduces
RefreshableTypedArray, a wrapper that lazily recreates the TypedArray view whenHEAPU8.bufferchanges. This uses a simple reference comparison that only triggers view recreation when actually needed.Affected call sites:
runtime.ts:executePendingJobs- readsctxPtrOutafterQTS_ExecutePendingJobcontext.ts:newPromise- reads resolve/reject handles afterQTS_NewPromiseCapabilitycontext.ts:getLength- readsuint32OutafterQTS_GetLengthcontext.ts:getOwnPropertyNames- readsoutPtranduint32OutafterQTS_GetOwnPropertyNamesAlso fixed:
getOwnPropertyNameswas usingHEAP8.bufferinstead ofHEAPU8.bufferFixes #240
Test plan
🤖 Generated with Claude Code