From b6b07462d361bb327634fefab3c372ae8d03d830 Mon Sep 17 00:00:00 2001 From: Tim Yung Date: Thu, 5 Jun 2025 15:19:06 -0700 Subject: [PATCH] RN: Patch `enableEagerAlternateStateNodeCleanup` into Renderers (OSS) (#51856) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/51856 Enables the `enableEagerAlternateStateNodeCleanup` feature flag in the open source React Native renderers that are currently targeting React 19.1, by manually patching them in the React Native repository. This feature flag has been found to significantly improve memory management of parent alternate fibers in persistent modes (i.e. Fabric), and we want this to be available to open source users of React Native before the next scheduled public version release of React. For more details about the fix, see: https://github.com/facebook/react/pull/33161 Changelog: [General][Changed] - Reduces memory usage, by improving memory management of parent alternate fibers. (Previously, a parent fiber might retain memory associated with shadow nodes from a previous commit.) Reviewed By: rickhanlonii Differential Revision: D76073900 fbshipit-source-id: 6779ea0862d4a1e25354b12ef3d1363dc12d26cc --- .../Libraries/Renderer/implementations/ReactFabric-dev.js | 4 +++- .../Libraries/Renderer/implementations/ReactFabric-prod.js | 4 +++- .../Renderer/implementations/ReactFabric-profiling.js | 4 +++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/packages/react-native/Libraries/Renderer/implementations/ReactFabric-dev.js b/packages/react-native/Libraries/Renderer/implementations/ReactFabric-dev.js index 153ddfa429f721..e6d005573a68c6 100644 --- a/packages/react-native/Libraries/Renderer/implementations/ReactFabric-dev.js +++ b/packages/react-native/Libraries/Renderer/implementations/ReactFabric-dev.js @@ -7,7 +7,7 @@ * @noflow * @nolint * @preventMunge - * @generated SignedSource<> + * @generated SignedSource<<6b3694149dd8856f0c741d3d94e05646>> * * This file was sync'd from the facebook/react repository. */ @@ -10483,6 +10483,8 @@ __DEV__ && (offscreenSubtreeWasHidden || null === current || safelyDetachRef(current, current.return)); + null !== finishedWork.alternate && + (finishedWork.alternate.stateNode = finishedWork.stateNode); break; case 6: recursivelyTraverseMutationEffects(root, finishedWork); diff --git a/packages/react-native/Libraries/Renderer/implementations/ReactFabric-prod.js b/packages/react-native/Libraries/Renderer/implementations/ReactFabric-prod.js index 2c9abc9e887dfd..b702448121449a 100644 --- a/packages/react-native/Libraries/Renderer/implementations/ReactFabric-prod.js +++ b/packages/react-native/Libraries/Renderer/implementations/ReactFabric-prod.js @@ -7,7 +7,7 @@ * @noflow * @nolint * @preventMunge - * @generated SignedSource<<558b9dfa7f6550519be8c208c6bc0eef>> + * @generated SignedSource<<7430b56dac3186eca669ae53bbf1f23d>> * * This file was sync'd from the facebook/react repository. */ @@ -8005,6 +8005,8 @@ function commitMutationEffectsOnFiber(finishedWork, root) { (offscreenSubtreeWasHidden || null === current || safelyDetachRef(current, current.return)); + null !== finishedWork.alternate && + (finishedWork.alternate.stateNode = finishedWork.stateNode); break; case 6: recursivelyTraverseMutationEffects(root, finishedWork); diff --git a/packages/react-native/Libraries/Renderer/implementations/ReactFabric-profiling.js b/packages/react-native/Libraries/Renderer/implementations/ReactFabric-profiling.js index c4b05f29d21cf4..698014a2e8ecbf 100644 --- a/packages/react-native/Libraries/Renderer/implementations/ReactFabric-profiling.js +++ b/packages/react-native/Libraries/Renderer/implementations/ReactFabric-profiling.js @@ -7,7 +7,7 @@ * @noflow * @nolint * @preventMunge - * @generated SignedSource<> + * @generated SignedSource<> * * This file was sync'd from the facebook/react repository. */ @@ -8488,6 +8488,8 @@ function commitMutationEffectsOnFiber(finishedWork, root) { (offscreenSubtreeWasHidden || null === current || safelyDetachRef(current, current.return)); + null !== finishedWork.alternate && + (finishedWork.alternate.stateNode = finishedWork.stateNode); break; case 6: recursivelyTraverseMutationEffects(root, finishedWork);