You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Replace manual memory management with FinalizationRegistry (#1908)
Summary:
Pull Request resolved: #1908Fixes#1818Fixes#1572
Yoga's JavaScript API currently requires users to manually call
`node.free()`, `node.freeRecursive()`, or `config.free()` to release
WASM memory. This is error-prone and unusual for a JavaScript library.
This diff uses `FinalizationRegistry` (available in all modern JS
engines) to automatically free WASM memory when JS objects are garbage
collected, removing this footgun entirely.
Changes:
- Added `FinalizationRegistry` instances for `Node` and `Config` in
`wrapAssembly.ts`. When a `NodeImpl`/`ConfigImpl` is constructed, it
is registered with the appropriate registry. The weak reference
callback receives the WASM pointer and calls the appropriate C free
function.
- The Node finalizer calls `YGNodeFinalize` (not `YGNodeFree`) to
safely deallocate without disconnecting nodes from their
owner/children, since an entire tree may be garbage collected
together.
- Removed `free()` and `freeRecursive()` from the public `Node` type
and `free()` from the public `Config` type.
- Removed `Yoga.Node.destroy()` and `Yoga.Config.destroy()` factory
methods.
- Fixed `setDirtiedFunc` to use `WeakRef(this)` instead of capturing
`this` directly in the closure stored in the dirtied func Map. The
previous `() => dirtiedFunc(this)` pattern created a strong reference
from the Map to the Node, preventing GC of detached nodes with a
dirtied func set.
- Updated `gentest-javascript.js` to stop generating `try`/`finally`
cleanup blocks and `let root` declarations in test prologues/epilogues.
- Removed all `free()`/`freeRecursive()`/`config.free()` calls from 25
generated test files and 9 hand-written test files.
- Re-signed all generated test files with signedsource.
- Updated `README.md` to remove manual memory management documentation.
Reviewed By: cipolleschi
Differential Revision: D95014519
0 commit comments