Skip to content

Commit 8223df1

Browse files
committed
Add eager alternate.stateNode cleanup (facebook#33161)
This is a fix for a problem where React retains shadow nodes longer than it needs to. The behaviour is shown in React Native test: https://github.com/facebook/react-native/blob/main/packages/react-native/src/private/__tests__/utilities/__tests__/ShadowNodeReferenceCounter-itest.js#L169 # Problem When React commits a new shadow tree, old shadow nodes are stored inside `fiber.alternate.stateNode`. This is not cleared up until React clones the node again. This may be problematic if mutation deletes a subtree, in that case `fiber.alternate.stateNode` will retain entire subtree until next update. In case of image nodes, this means retaining entire images. So when React goes from revision A: `<View><View /></View>` to revision B: `<View />`, `fiber.alternate.stateNode` will be pointing to Shadow Node that represents revision A.. ![image](https://github.com/user-attachments/assets/076b677e-d152-4763-8c9d-4f923212b424) # Fix To fix this, this PR adds a new feature flag `enableEagerAlternateStateNodeCleanup`. When enabled, `alternate.stateNode` is proactively pointed towards finishedWork's stateNode, releasing resources sooner. I have verified this fixes the issue [demonstrated by React Native tests](https://github.com/facebook/react-native/blob/main/packages/react-native/src/private/__tests__/utilities/__tests__/ShadowNodeReferenceCounter-itest.js#L169). All existing React tests pass when the flag is enabled. DiffTrain build for [5d04d73](facebook@5d04d73)
1 parent d6252d2 commit 8223df1

24 files changed

+102
-87
lines changed

compiled-rn/VERSION_NATIVE_FB

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
19.2.0-native-fb-3820740a-20250509
1+
19.2.0-native-fb-5d04d732-20250512

compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react-dom/cjs/ReactDOM-dev.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* @noflow
88
* @nolint
99
* @preventMunge
10-
* @generated SignedSource<<25b4e36b7094ea15dc92f752e91cc3e6>>
10+
* @generated SignedSource<<68ae96eb252da2ab036271f7dab93f8d>>
1111
*/
1212

1313
"use strict";
@@ -404,5 +404,5 @@ __DEV__ &&
404404
exports.useFormStatus = function () {
405405
return resolveDispatcher().useHostTransitionStatus();
406406
};
407-
exports.version = "19.2.0-native-fb-3820740a-20250509";
407+
exports.version = "19.2.0-native-fb-5d04d732-20250512";
408408
})();

compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react-dom/cjs/ReactDOM-prod.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* @noflow
88
* @nolint
99
* @preventMunge
10-
* @generated SignedSource<<41af065ee488f0f3c8ca924f1088f5a8>>
10+
* @generated SignedSource<<1a4fbfad14dfb9f207da7764dc86d0a9>>
1111
*/
1212

1313
"use strict";
@@ -203,4 +203,4 @@ exports.useFormState = function (action, initialState, permalink) {
203203
exports.useFormStatus = function () {
204204
return ReactSharedInternals.H.useHostTransitionStatus();
205205
};
206-
exports.version = "19.2.0-native-fb-3820740a-20250509";
206+
exports.version = "19.2.0-native-fb-5d04d732-20250512";

compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react-dom/cjs/ReactDOM-profiling.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* @noflow
88
* @nolint
99
* @preventMunge
10-
* @generated SignedSource<<41af065ee488f0f3c8ca924f1088f5a8>>
10+
* @generated SignedSource<<1a4fbfad14dfb9f207da7764dc86d0a9>>
1111
*/
1212

1313
"use strict";
@@ -203,4 +203,4 @@ exports.useFormState = function (action, initialState, permalink) {
203203
exports.useFormStatus = function () {
204204
return ReactSharedInternals.H.useHostTransitionStatus();
205205
};
206-
exports.version = "19.2.0-native-fb-3820740a-20250509";
206+
exports.version = "19.2.0-native-fb-5d04d732-20250512";

compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react-dom/cjs/ReactDOMClient-dev.js

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* @noflow
88
* @nolint
99
* @preventMunge
10-
* @generated SignedSource<<76feecee4f0a52c47a3cc07d0d7ee44b>>
10+
* @generated SignedSource<<6d27da61314961641e7cf54a2362c123>>
1111
*/
1212

1313
/*
@@ -26958,11 +26958,11 @@ __DEV__ &&
2695826958
};
2695926959
(function () {
2696026960
var isomorphicReactPackageVersion = React.version;
26961-
if ("19.2.0-native-fb-3820740a-20250509" !== isomorphicReactPackageVersion)
26961+
if ("19.2.0-native-fb-5d04d732-20250512" !== isomorphicReactPackageVersion)
2696226962
throw Error(
2696326963
'Incompatible React versions: The "react" and "react-dom" packages must have the exact same version. Instead got:\n - react: ' +
2696426964
(isomorphicReactPackageVersion +
26965-
"\n - react-dom: 19.2.0-native-fb-3820740a-20250509\nLearn more: https://react.dev/warnings/version-mismatch")
26965+
"\n - react-dom: 19.2.0-native-fb-5d04d732-20250512\nLearn more: https://react.dev/warnings/version-mismatch")
2696626966
);
2696726967
})();
2696826968
("function" === typeof Map &&
@@ -26999,10 +26999,10 @@ __DEV__ &&
2699926999
!(function () {
2700027000
var internals = {
2700127001
bundleType: 1,
27002-
version: "19.2.0-native-fb-3820740a-20250509",
27002+
version: "19.2.0-native-fb-5d04d732-20250512",
2700327003
rendererPackageName: "react-dom",
2700427004
currentDispatcherRef: ReactSharedInternals,
27005-
reconcilerVersion: "19.2.0-native-fb-3820740a-20250509"
27005+
reconcilerVersion: "19.2.0-native-fb-5d04d732-20250512"
2700627006
};
2700727007
internals.overrideHookState = overrideHookState;
2700827008
internals.overrideHookStateDeletePath = overrideHookStateDeletePath;
@@ -27140,5 +27140,5 @@ __DEV__ &&
2714027140
listenToAllSupportedEvents(container);
2714127141
return new ReactDOMHydrationRoot(initialChildren);
2714227142
};
27143-
exports.version = "19.2.0-native-fb-3820740a-20250509";
27143+
exports.version = "19.2.0-native-fb-5d04d732-20250512";
2714427144
})();

compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react-dom/cjs/ReactDOMClient-prod.js

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* @noflow
88
* @nolint
99
* @preventMunge
10-
* @generated SignedSource<<1f8de5a86afd11f4b7311b0e7a887ea6>>
10+
* @generated SignedSource<<3442a9f5f58224570ecd258d47885200>>
1111
*/
1212

1313
/*
@@ -17049,14 +17049,14 @@ ReactDOMHydrationRoot.prototype.unstable_scheduleHydration = function (target) {
1704917049
};
1705017050
var isomorphicReactPackageVersion$jscomp$inline_2015 = React.version;
1705117051
if (
17052-
"19.2.0-native-fb-3820740a-20250509" !==
17052+
"19.2.0-native-fb-5d04d732-20250512" !==
1705317053
isomorphicReactPackageVersion$jscomp$inline_2015
1705417054
)
1705517055
throw Error(
1705617056
formatProdErrorMessage(
1705717057
527,
1705817058
isomorphicReactPackageVersion$jscomp$inline_2015,
17059-
"19.2.0-native-fb-3820740a-20250509"
17059+
"19.2.0-native-fb-5d04d732-20250512"
1706017060
)
1706117061
);
1706217062
ReactDOMSharedInternals.findDOMNode = function (componentOrElement) {
@@ -17078,10 +17078,10 @@ ReactDOMSharedInternals.findDOMNode = function (componentOrElement) {
1707817078
};
1707917079
var internals$jscomp$inline_2534 = {
1708017080
bundleType: 0,
17081-
version: "19.2.0-native-fb-3820740a-20250509",
17081+
version: "19.2.0-native-fb-5d04d732-20250512",
1708217082
rendererPackageName: "react-dom",
1708317083
currentDispatcherRef: ReactSharedInternals,
17084-
reconcilerVersion: "19.2.0-native-fb-3820740a-20250509"
17084+
reconcilerVersion: "19.2.0-native-fb-5d04d732-20250512"
1708517085
};
1708617086
if ("undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__) {
1708717087
var hook$jscomp$inline_2535 = __REACT_DEVTOOLS_GLOBAL_HOOK__;
@@ -17179,4 +17179,4 @@ exports.hydrateRoot = function (container, initialChildren, options) {
1717917179
listenToAllSupportedEvents(container);
1718017180
return new ReactDOMHydrationRoot(initialChildren);
1718117181
};
17182-
exports.version = "19.2.0-native-fb-3820740a-20250509";
17182+
exports.version = "19.2.0-native-fb-5d04d732-20250512";

compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react-dom/cjs/ReactDOMClient-profiling.js

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* @noflow
88
* @nolint
99
* @preventMunge
10-
* @generated SignedSource<<03c4cf05a25988ae1f0a0d2904b80f8b>>
10+
* @generated SignedSource<<cddc1a32ff69c059973a4c78dbb4d67e>>
1111
*/
1212

1313
/*
@@ -17759,14 +17759,14 @@ ReactDOMHydrationRoot.prototype.unstable_scheduleHydration = function (target) {
1775917759
};
1776017760
var isomorphicReactPackageVersion$jscomp$inline_2118 = React.version;
1776117761
if (
17762-
"19.2.0-native-fb-3820740a-20250509" !==
17762+
"19.2.0-native-fb-5d04d732-20250512" !==
1776317763
isomorphicReactPackageVersion$jscomp$inline_2118
1776417764
)
1776517765
throw Error(
1776617766
formatProdErrorMessage(
1776717767
527,
1776817768
isomorphicReactPackageVersion$jscomp$inline_2118,
17769-
"19.2.0-native-fb-3820740a-20250509"
17769+
"19.2.0-native-fb-5d04d732-20250512"
1777017770
)
1777117771
);
1777217772
ReactDOMSharedInternals.findDOMNode = function (componentOrElement) {
@@ -17788,10 +17788,10 @@ ReactDOMSharedInternals.findDOMNode = function (componentOrElement) {
1778817788
};
1778917789
var internals$jscomp$inline_2125 = {
1779017790
bundleType: 0,
17791-
version: "19.2.0-native-fb-3820740a-20250509",
17791+
version: "19.2.0-native-fb-5d04d732-20250512",
1779217792
rendererPackageName: "react-dom",
1779317793
currentDispatcherRef: ReactSharedInternals,
17794-
reconcilerVersion: "19.2.0-native-fb-3820740a-20250509",
17794+
reconcilerVersion: "19.2.0-native-fb-5d04d732-20250512",
1779517795
getLaneLabelMap: function () {
1779617796
for (
1779717797
var map = new Map(), lane = 1, index$313 = 0;
@@ -17904,4 +17904,4 @@ exports.hydrateRoot = function (container, initialChildren, options) {
1790417904
listenToAllSupportedEvents(container);
1790517905
return new ReactDOMHydrationRoot(initialChildren);
1790617906
};
17907-
exports.version = "19.2.0-native-fb-3820740a-20250509";
17907+
exports.version = "19.2.0-native-fb-5d04d732-20250512";

compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react-dom/cjs/ReactDOMProfiling-dev.js

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* @noflow
88
* @nolint
99
* @preventMunge
10-
* @generated SignedSource<<3696261889534ceaa61d8ca1a9fa2a91>>
10+
* @generated SignedSource<<60eea729385551c6bccbf09b728212bf>>
1111
*/
1212

1313
/*
@@ -27014,11 +27014,11 @@ __DEV__ &&
2701427014
};
2701527015
(function () {
2701627016
var isomorphicReactPackageVersion = React.version;
27017-
if ("19.2.0-native-fb-3820740a-20250509" !== isomorphicReactPackageVersion)
27017+
if ("19.2.0-native-fb-5d04d732-20250512" !== isomorphicReactPackageVersion)
2701827018
throw Error(
2701927019
'Incompatible React versions: The "react" and "react-dom" packages must have the exact same version. Instead got:\n - react: ' +
2702027020
(isomorphicReactPackageVersion +
27021-
"\n - react-dom: 19.2.0-native-fb-3820740a-20250509\nLearn more: https://react.dev/warnings/version-mismatch")
27021+
"\n - react-dom: 19.2.0-native-fb-5d04d732-20250512\nLearn more: https://react.dev/warnings/version-mismatch")
2702227022
);
2702327023
})();
2702427024
("function" === typeof Map &&
@@ -27055,10 +27055,10 @@ __DEV__ &&
2705527055
!(function () {
2705627056
var internals = {
2705727057
bundleType: 1,
27058-
version: "19.2.0-native-fb-3820740a-20250509",
27058+
version: "19.2.0-native-fb-5d04d732-20250512",
2705927059
rendererPackageName: "react-dom",
2706027060
currentDispatcherRef: ReactSharedInternals,
27061-
reconcilerVersion: "19.2.0-native-fb-3820740a-20250509"
27061+
reconcilerVersion: "19.2.0-native-fb-5d04d732-20250512"
2706227062
};
2706327063
internals.overrideHookState = overrideHookState;
2706427064
internals.overrideHookStateDeletePath = overrideHookStateDeletePath;
@@ -27512,7 +27512,7 @@ __DEV__ &&
2751227512
exports.useFormStatus = function () {
2751327513
return resolveDispatcher().useHostTransitionStatus();
2751427514
};
27515-
exports.version = "19.2.0-native-fb-3820740a-20250509";
27515+
exports.version = "19.2.0-native-fb-5d04d732-20250512";
2751627516
"undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&
2751727517
"function" ===
2751827518
typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop &&

compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react-dom/cjs/ReactDOMProfiling-prod.js

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* @noflow
88
* @nolint
99
* @preventMunge
10-
* @generated SignedSource<<0aa7cdf2320221c483b837544445e39f>>
10+
* @generated SignedSource<<9985aa1f8e52cbdda2de5c30b9702b4f>>
1111
*/
1212

1313
/*
@@ -17060,14 +17060,14 @@ ReactDOMHydrationRoot.prototype.unstable_scheduleHydration = function (target) {
1706017060
};
1706117061
var isomorphicReactPackageVersion$jscomp$inline_2016 = React.version;
1706217062
if (
17063-
"19.2.0-native-fb-3820740a-20250509" !==
17063+
"19.2.0-native-fb-5d04d732-20250512" !==
1706417064
isomorphicReactPackageVersion$jscomp$inline_2016
1706517065
)
1706617066
throw Error(
1706717067
formatProdErrorMessage(
1706817068
527,
1706917069
isomorphicReactPackageVersion$jscomp$inline_2016,
17070-
"19.2.0-native-fb-3820740a-20250509"
17070+
"19.2.0-native-fb-5d04d732-20250512"
1707117071
)
1707217072
);
1707317073
ReactDOMSharedInternals.findDOMNode = function (componentOrElement) {
@@ -17089,10 +17089,10 @@ ReactDOMSharedInternals.findDOMNode = function (componentOrElement) {
1708917089
};
1709017090
var internals$jscomp$inline_2537 = {
1709117091
bundleType: 0,
17092-
version: "19.2.0-native-fb-3820740a-20250509",
17092+
version: "19.2.0-native-fb-5d04d732-20250512",
1709317093
rendererPackageName: "react-dom",
1709417094
currentDispatcherRef: ReactSharedInternals,
17095-
reconcilerVersion: "19.2.0-native-fb-3820740a-20250509"
17095+
reconcilerVersion: "19.2.0-native-fb-5d04d732-20250512"
1709617096
};
1709717097
if ("undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__) {
1709817098
var hook$jscomp$inline_2538 = __REACT_DEVTOOLS_GLOBAL_HOOK__;
@@ -17343,4 +17343,4 @@ exports.useFormState = function (action, initialState, permalink) {
1734317343
exports.useFormStatus = function () {
1734417344
return ReactSharedInternals.H.useHostTransitionStatus();
1734517345
};
17346-
exports.version = "19.2.0-native-fb-3820740a-20250509";
17346+
exports.version = "19.2.0-native-fb-5d04d732-20250512";

compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react-dom/cjs/ReactDOMProfiling-profiling.js

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* @noflow
88
* @nolint
99
* @preventMunge
10-
* @generated SignedSource<<ffdfe2ea49628b58ebe55fb50e0f16f1>>
10+
* @generated SignedSource<<6db0a4344ce8ed47c63f948527c607c2>>
1111
*/
1212

1313
/*
@@ -17774,14 +17774,14 @@ ReactDOMHydrationRoot.prototype.unstable_scheduleHydration = function (target) {
1777417774
};
1777517775
var isomorphicReactPackageVersion$jscomp$inline_2119 = React.version;
1777617776
if (
17777-
"19.2.0-native-fb-3820740a-20250509" !==
17777+
"19.2.0-native-fb-5d04d732-20250512" !==
1777817778
isomorphicReactPackageVersion$jscomp$inline_2119
1777917779
)
1778017780
throw Error(
1778117781
formatProdErrorMessage(
1778217782
527,
1778317783
isomorphicReactPackageVersion$jscomp$inline_2119,
17784-
"19.2.0-native-fb-3820740a-20250509"
17784+
"19.2.0-native-fb-5d04d732-20250512"
1778517785
)
1778617786
);
1778717787
ReactDOMSharedInternals.findDOMNode = function (componentOrElement) {
@@ -17803,10 +17803,10 @@ ReactDOMSharedInternals.findDOMNode = function (componentOrElement) {
1780317803
};
1780417804
var internals$jscomp$inline_2126 = {
1780517805
bundleType: 0,
17806-
version: "19.2.0-native-fb-3820740a-20250509",
17806+
version: "19.2.0-native-fb-5d04d732-20250512",
1780717807
rendererPackageName: "react-dom",
1780817808
currentDispatcherRef: ReactSharedInternals,
17809-
reconcilerVersion: "19.2.0-native-fb-3820740a-20250509",
17809+
reconcilerVersion: "19.2.0-native-fb-5d04d732-20250512",
1781017810
getLaneLabelMap: function () {
1781117811
for (
1781217812
var map = new Map(), lane = 1, index$313 = 0;
@@ -18072,7 +18072,7 @@ exports.useFormState = function (action, initialState, permalink) {
1807218072
exports.useFormStatus = function () {
1807318073
return ReactSharedInternals.H.useHostTransitionStatus();
1807418074
};
18075-
exports.version = "19.2.0-native-fb-3820740a-20250509";
18075+
exports.version = "19.2.0-native-fb-5d04d732-20250512";
1807618076
"undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&
1807718077
"function" ===
1807818078
typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop &&

compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react-test-renderer/cjs/ReactTestRenderer-dev.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* @noflow
88
* @nolint
99
* @preventMunge
10-
* @generated SignedSource<<e9f9ec002a88298eb83ee5cb2e4e1c37>>
10+
* @generated SignedSource<<d818140bed2a4b48a1dfec7dbb2d82e6>>
1111
*/
1212

1313
"use strict";
@@ -15657,10 +15657,10 @@ __DEV__ &&
1565715657
(function () {
1565815658
var internals = {
1565915659
bundleType: 1,
15660-
version: "19.2.0-native-fb-3820740a-20250509",
15660+
version: "19.2.0-native-fb-5d04d732-20250512",
1566115661
rendererPackageName: "react-test-renderer",
1566215662
currentDispatcherRef: ReactSharedInternals,
15663-
reconcilerVersion: "19.2.0-native-fb-3820740a-20250509"
15663+
reconcilerVersion: "19.2.0-native-fb-5d04d732-20250512"
1566415664
};
1566515665
internals.overrideHookState = overrideHookState;
1566615666
internals.overrideHookStateDeletePath = overrideHookStateDeletePath;
@@ -15805,5 +15805,5 @@ __DEV__ &&
1580515805
flushSyncWorkAcrossRoots_impl(0, !0));
1580615806
}
1580715807
};
15808-
exports.version = "19.2.0-native-fb-3820740a-20250509";
15808+
exports.version = "19.2.0-native-fb-5d04d732-20250512";
1580915809
})();

compiled-rn/facebook-fbsource/xplat/js/RKJSModules/vendor/react/react-test-renderer/cjs/ReactTestRenderer-prod.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* @noflow
88
* @nolint
99
* @preventMunge
10-
* @generated SignedSource<<7c3212f5d39f5a1aa37553da4d4ab792>>
10+
* @generated SignedSource<<41e0720f028c285eb8216257e177a0e2>>
1111
*/
1212

1313
"use strict";
@@ -9896,10 +9896,10 @@ function wrapFiber(fiber) {
98969896
}
98979897
var internals$jscomp$inline_1446 = {
98989898
bundleType: 0,
9899-
version: "19.2.0-native-fb-3820740a-20250509",
9899+
version: "19.2.0-native-fb-5d04d732-20250512",
99009900
rendererPackageName: "react-test-renderer",
99019901
currentDispatcherRef: ReactSharedInternals,
9902-
reconcilerVersion: "19.2.0-native-fb-3820740a-20250509"
9902+
reconcilerVersion: "19.2.0-native-fb-5d04d732-20250512"
99039903
};
99049904
if ("undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__) {
99059905
var hook$jscomp$inline_1447 = __REACT_DEVTOOLS_GLOBAL_HOOK__;
@@ -10035,4 +10035,4 @@ exports.unstable_batchedUpdates = function (fn, a) {
1003510035
flushSyncWorkAcrossRoots_impl(0, !0));
1003610036
}
1003710037
};
10038-
exports.version = "19.2.0-native-fb-3820740a-20250509";
10038+
exports.version = "19.2.0-native-fb-5d04d732-20250512";

0 commit comments

Comments
 (0)