Skip to content

Commit 9c2b30b

Browse files
committed
[flags] add enableEffectEventMutationPhase (#35548)
Small optimization for useEffectEvent. Not sure we even need a flag for it, but it will be a nice killswitch. As an added benefit, it fixes a bug when `enableViewTransition` is on, where we were not updating the useEffectEvent callback when a tree went from hidden to visible. DiffTrain build for [3aaab92](3aaab92)
1 parent f44a4f7 commit 9c2b30b

34 files changed

+3058
-2844
lines changed

compiled/facebook-www/REVISION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
087a34696f1eb484157b19aee1648bcbce51de64
1+
3aaab92a265ebeb43b15e7c30c2f1dfb9fcd5961
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
087a34696f1eb484157b19aee1648bcbce51de64
1+
3aaab92a265ebeb43b15e7c30c2f1dfb9fcd5961

compiled/facebook-www/React-dev.classic.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1482,7 +1482,7 @@ __DEV__ &&
14821482
exports.useTransition = function () {
14831483
return resolveDispatcher().useTransition();
14841484
};
1485-
exports.version = "19.3.0-www-classic-087a3469-20260204";
1485+
exports.version = "19.3.0-www-classic-3aaab92a-20260204";
14861486
"undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&
14871487
"function" ===
14881488
typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop &&

compiled/facebook-www/React-dev.modern.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1482,7 +1482,7 @@ __DEV__ &&
14821482
exports.useTransition = function () {
14831483
return resolveDispatcher().useTransition();
14841484
};
1485-
exports.version = "19.3.0-www-modern-087a3469-20260204";
1485+
exports.version = "19.3.0-www-modern-3aaab92a-20260204";
14861486
"undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&
14871487
"function" ===
14881488
typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop &&

compiled/facebook-www/React-prod.classic.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -610,4 +610,4 @@ exports.useSyncExternalStore = function (
610610
exports.useTransition = function () {
611611
return ReactSharedInternals.H.useTransition();
612612
};
613-
exports.version = "19.3.0-www-classic-087a3469-20260204";
613+
exports.version = "19.3.0-www-classic-3aaab92a-20260204";

compiled/facebook-www/React-prod.modern.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -610,4 +610,4 @@ exports.useSyncExternalStore = function (
610610
exports.useTransition = function () {
611611
return ReactSharedInternals.H.useTransition();
612612
};
613-
exports.version = "19.3.0-www-modern-087a3469-20260204";
613+
exports.version = "19.3.0-www-modern-3aaab92a-20260204";

compiled/facebook-www/React-profiling.classic.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -614,7 +614,7 @@ exports.useSyncExternalStore = function (
614614
exports.useTransition = function () {
615615
return ReactSharedInternals.H.useTransition();
616616
};
617-
exports.version = "19.3.0-www-classic-087a3469-20260204";
617+
exports.version = "19.3.0-www-classic-3aaab92a-20260204";
618618
"undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&
619619
"function" ===
620620
typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop &&

compiled/facebook-www/React-profiling.modern.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -614,7 +614,7 @@ exports.useSyncExternalStore = function (
614614
exports.useTransition = function () {
615615
return ReactSharedInternals.H.useTransition();
616616
};
617-
exports.version = "19.3.0-www-modern-087a3469-20260204";
617+
exports.version = "19.3.0-www-modern-3aaab92a-20260204";
618618
"undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&
619619
"function" ===
620620
typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop &&

compiled/facebook-www/ReactART-dev.classic.js

Lines changed: 84 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -12046,6 +12046,7 @@ __DEV__ &&
1204612046
case 11:
1204712047
case 15:
1204812048
if (
12049+
!enableEffectEventMutationPhase &&
1204912050
0 !== (flags & 4) &&
1205012051
((finishedWork = finishedWork.updateQueue),
1205112052
(finishedWork =
@@ -12993,6 +12994,17 @@ __DEV__ &&
1299312994
case 11:
1299412995
case 14:
1299512996
case 15:
12997+
if (
12998+
enableEffectEventMutationPhase &&
12999+
flags & 4 &&
13000+
((current = finishedWork.updateQueue),
13001+
(current = null !== current ? current.events : null),
13002+
null !== current)
13003+
)
13004+
for (var ii = 0; ii < current.length; ii++) {
13005+
var _eventPayloads$ii2 = current[ii];
13006+
_eventPayloads$ii2.ref.impl = _eventPayloads$ii2.nextImpl;
13007+
}
1299613008
recursivelyTraverseMutationEffects(root, finishedWork, lanes);
1299713009
commitReconciliationEffects(finishedWork);
1299813010
flags & 4 &&
@@ -13017,21 +13029,21 @@ __DEV__ &&
1301713029
safelyDetachRef(current, current.return));
1301813030
flags & 64 &&
1301913031
offscreenSubtreeIsHidden &&
13020-
((current = finishedWork.updateQueue),
13021-
null !== current &&
13022-
((root = current.callbacks),
13023-
null !== root &&
13024-
((lanes = current.shared.hiddenCallbacks),
13025-
(current.shared.hiddenCallbacks =
13026-
null === lanes ? root : lanes.concat(root)))));
13032+
((root = finishedWork.updateQueue),
13033+
null !== root &&
13034+
((lanes = root.callbacks),
13035+
null !== lanes &&
13036+
((flags = root.shared.hiddenCallbacks),
13037+
(root.shared.hiddenCallbacks =
13038+
null === flags ? lanes : flags.concat(lanes)))));
1302713039
break;
1302813040
case 26:
1302913041
case 27:
1303013042
case 5:
13031-
var prevOffscreenDirectParentIsHidden = offscreenDirectParentIsHidden;
13043+
ii = offscreenDirectParentIsHidden;
1303213044
offscreenDirectParentIsHidden = !1;
1303313045
recursivelyTraverseMutationEffects(root, finishedWork, lanes);
13034-
offscreenDirectParentIsHidden = prevOffscreenDirectParentIsHidden;
13046+
offscreenDirectParentIsHidden = ii;
1303513047
commitReconciliationEffects(finishedWork);
1303613048
flags & 512 &&
1303713049
(offscreenSubtreeWasHidden ||
@@ -13048,14 +13060,14 @@ __DEV__ &&
1304813060
}
1304913061
if (flags & 4 && null != finishedWork.stateNode) {
1305013062
root = finishedWork.memoizedProps;
13051-
current = null !== current ? current.memoizedProps : root;
13063+
lanes = null !== current ? current.memoizedProps : root;
1305213064
try {
1305313065
runWithFiberInDEV(
1305413066
finishedWork,
1305513067
commitUpdate,
1305613068
finishedWork.stateNode,
1305713069
finishedWork.type,
13058-
current,
13070+
lanes,
1305913071
root,
1306013072
finishedWork
1306113073
);
@@ -13078,14 +13090,14 @@ __DEV__ &&
1307813090
"This should have a text node initialized. This error is likely caused by a bug in React. Please file an issue."
1307913091
);
1308013092
root = finishedWork.memoizedProps;
13081-
current = null !== current ? current.memoizedProps : root;
13082-
lanes = finishedWork.stateNode;
13093+
lanes = null !== current ? current.memoizedProps : root;
13094+
flags = finishedWork.stateNode;
1308313095
try {
1308413096
runWithFiberInDEV(
1308513097
finishedWork,
1308613098
commitTextUpdate,
13099+
flags,
1308713100
lanes,
13088-
current,
1308913101
root
1309013102
),
1309113103
trackHostMutation();
@@ -13095,95 +13107,89 @@ __DEV__ &&
1309513107
}
1309613108
break;
1309713109
case 3:
13098-
current = pushNestedEffectDurations();
13110+
flags = pushNestedEffectDurations();
1309913111
rootMutationContext = !1;
1310013112
enableViewTransition && (viewTransitionMutationContext = !1);
1310113113
recursivelyTraverseMutationEffects(root, finishedWork, lanes);
1310213114
commitReconciliationEffects(finishedWork);
13103-
root.effectDuration += popNestedEffectDurations(current);
13115+
root.effectDuration += popNestedEffectDurations(flags);
1310413116
popMutationContext(!1);
1310513117
rootMutationContext &&
1310613118
0 !== (lanes & 34) &&
1310713119
((root.indicatorLanes &= ~currentEventTransitionLane),
1310813120
(needsIsomorphicIndicator = !1));
1310913121
break;
1311013122
case 4:
13111-
current = offscreenDirectParentIsHidden;
13123+
flags = offscreenDirectParentIsHidden;
1311213124
offscreenDirectParentIsHidden = offscreenSubtreeIsHidden;
13113-
flags = pushMutationContext();
13125+
current = pushMutationContext();
1311413126
recursivelyTraverseMutationEffects(root, finishedWork, lanes);
1311513127
commitReconciliationEffects(finishedWork);
13116-
popMutationContext(flags);
13117-
offscreenDirectParentIsHidden = current;
13128+
popMutationContext(current);
13129+
offscreenDirectParentIsHidden = flags;
1311813130
break;
1311913131
case 12:
13120-
current = pushNestedEffectDurations();
13132+
flags = pushNestedEffectDurations();
1312113133
recursivelyTraverseMutationEffects(root, finishedWork, lanes);
1312213134
commitReconciliationEffects(finishedWork);
1312313135
finishedWork.stateNode.effectDuration +=
13124-
bubbleNestedEffectDurations(current);
13136+
bubbleNestedEffectDurations(flags);
1312513137
break;
1312613138
case 31:
1312713139
recursivelyTraverseMutationEffects(root, finishedWork, lanes);
1312813140
commitReconciliationEffects(finishedWork);
1312913141
flags & 4 &&
13130-
((current = finishedWork.updateQueue),
13131-
null !== current &&
13142+
((root = finishedWork.updateQueue),
13143+
null !== root &&
1313213144
((finishedWork.updateQueue = null),
13133-
attachSuspenseRetryListeners(finishedWork, current)));
13145+
attachSuspenseRetryListeners(finishedWork, root)));
1313413146
break;
1313513147
case 13:
1313613148
recursivelyTraverseMutationEffects(root, finishedWork, lanes);
1313713149
commitReconciliationEffects(finishedWork);
1313813150
finishedWork.child.flags & 8192 &&
1313913151
((root = null !== finishedWork.memoizedState),
13140-
(current = null !== current && null !== current.memoizedState),
13152+
(lanes = null !== current && null !== current.memoizedState),
1314113153
alwaysThrottleRetries
13142-
? root !== current && (globalMostRecentFallbackTime = now$1())
13143-
: root && !current && (globalMostRecentFallbackTime = now$1()));
13154+
? root !== lanes && (globalMostRecentFallbackTime = now$1())
13155+
: root && !lanes && (globalMostRecentFallbackTime = now$1()));
1314413156
if (flags & 4) {
1314513157
try {
13146-
if (null !== finishedWork.memoizedState)
13147-
if (
13148-
((prevOffscreenDirectParentIsHidden =
13149-
finishedWork.memoizedProps.suspenseCallback),
13150-
"function" === typeof prevOffscreenDirectParentIsHidden)
13151-
) {
13152-
var retryQueue = finishedWork.updateQueue;
13153-
null !== retryQueue &&
13154-
prevOffscreenDirectParentIsHidden(new Set(retryQueue));
13155-
} else
13156-
void 0 !== prevOffscreenDirectParentIsHidden &&
13157-
console.error("Unexpected type for suspenseCallback.");
13158+
null !== finishedWork.memoizedState &&
13159+
((ii = finishedWork.memoizedProps.suspenseCallback),
13160+
"function" === typeof ii
13161+
? ((_eventPayloads$ii2 = finishedWork.updateQueue),
13162+
null !== _eventPayloads$ii2 &&
13163+
ii(new Set(_eventPayloads$ii2)))
13164+
: void 0 !== ii &&
13165+
console.error("Unexpected type for suspenseCallback."));
1315813166
} catch (error) {
1315913167
captureCommitPhaseError(finishedWork, finishedWork.return, error);
1316013168
}
13161-
current = finishedWork.updateQueue;
13162-
null !== current &&
13169+
root = finishedWork.updateQueue;
13170+
null !== root &&
1316313171
((finishedWork.updateQueue = null),
13164-
attachSuspenseRetryListeners(finishedWork, current));
13172+
attachSuspenseRetryListeners(finishedWork, root));
1316513173
}
1316613174
break;
1316713175
case 22:
13168-
prevOffscreenDirectParentIsHidden =
13169-
null !== finishedWork.memoizedState;
13170-
retryQueue = null !== current && null !== current.memoizedState;
13176+
ii = null !== finishedWork.memoizedState;
13177+
_eventPayloads$ii2 =
13178+
null !== current && null !== current.memoizedState;
1317113179
var prevOffscreenSubtreeIsHidden = offscreenSubtreeIsHidden,
1317213180
prevOffscreenSubtreeWasHidden = offscreenSubtreeWasHidden,
1317313181
_prevOffscreenDirectParentIsHidden2 = offscreenDirectParentIsHidden;
13174-
offscreenSubtreeIsHidden =
13175-
prevOffscreenSubtreeIsHidden || prevOffscreenDirectParentIsHidden;
13182+
offscreenSubtreeIsHidden = prevOffscreenSubtreeIsHidden || ii;
1317613183
offscreenDirectParentIsHidden =
13177-
_prevOffscreenDirectParentIsHidden2 ||
13178-
prevOffscreenDirectParentIsHidden;
13184+
_prevOffscreenDirectParentIsHidden2 || ii;
1317913185
offscreenSubtreeWasHidden =
13180-
prevOffscreenSubtreeWasHidden || retryQueue;
13186+
prevOffscreenSubtreeWasHidden || _eventPayloads$ii2;
1318113187
recursivelyTraverseMutationEffects(root, finishedWork, lanes);
1318213188
offscreenSubtreeWasHidden = prevOffscreenSubtreeWasHidden;
1318313189
offscreenDirectParentIsHidden = _prevOffscreenDirectParentIsHidden2;
1318413190
offscreenSubtreeIsHidden = prevOffscreenSubtreeIsHidden;
13185-
retryQueue &&
13186-
!prevOffscreenDirectParentIsHidden &&
13191+
_eventPayloads$ii2 &&
13192+
!ii &&
1318713193
!prevOffscreenSubtreeIsHidden &&
1318813194
!prevOffscreenSubtreeWasHidden &&
1318913195
0 !== (finishedWork.mode & 2) &&
@@ -13198,12 +13204,12 @@ __DEV__ &&
1319813204
commitReconciliationEffects(finishedWork);
1319913205
flags & 8192 &&
1320013206
((root = finishedWork.stateNode),
13201-
(root._visibility = prevOffscreenDirectParentIsHidden
13207+
(root._visibility = ii
1320213208
? root._visibility & ~OffscreenVisible
1320313209
: root._visibility | OffscreenVisible),
13204-
!prevOffscreenDirectParentIsHidden ||
13210+
!ii ||
1320513211
null === current ||
13206-
retryQueue ||
13212+
_eventPayloads$ii2 ||
1320713213
offscreenSubtreeIsHidden ||
1320813214
offscreenSubtreeWasHidden ||
1320913215
(recursivelyTraverseDisappearLayoutEffects(finishedWork),
@@ -13217,28 +13223,24 @@ __DEV__ &&
1321713223
componentEffectEndTime,
1321813224
"Disconnect"
1321913225
)),
13220-
(!prevOffscreenDirectParentIsHidden &&
13221-
offscreenDirectParentIsHidden) ||
13222-
hideOrUnhideAllChildren(
13223-
finishedWork,
13224-
prevOffscreenDirectParentIsHidden
13225-
));
13226+
(!ii && offscreenDirectParentIsHidden) ||
13227+
hideOrUnhideAllChildren(finishedWork, ii));
1322613228
flags & 4 &&
13227-
((current = finishedWork.updateQueue),
13228-
null !== current &&
13229-
((root = current.retryQueue),
13230-
null !== root &&
13231-
((current.retryQueue = null),
13232-
attachSuspenseRetryListeners(finishedWork, root))));
13229+
((root = finishedWork.updateQueue),
13230+
null !== root &&
13231+
((lanes = root.retryQueue),
13232+
null !== lanes &&
13233+
((root.retryQueue = null),
13234+
attachSuspenseRetryListeners(finishedWork, lanes))));
1323313235
break;
1323413236
case 19:
1323513237
recursivelyTraverseMutationEffects(root, finishedWork, lanes);
1323613238
commitReconciliationEffects(finishedWork);
1323713239
flags & 4 &&
13238-
((current = finishedWork.updateQueue),
13239-
null !== current &&
13240+
((root = finishedWork.updateQueue),
13241+
null !== root &&
1324013242
((finishedWork.updateQueue = null),
13241-
attachSuspenseRetryListeners(finishedWork, current)));
13243+
attachSuspenseRetryListeners(finishedWork, root)));
1324213244
break;
1324313245
case 30:
1324413246
enableViewTransition &&
@@ -13247,18 +13249,17 @@ __DEV__ &&
1324713249
null === current ||
1324813250
safelyDetachRef(current, current.return)),
1324913251
(flags = pushMutationContext()),
13250-
(prevOffscreenDirectParentIsHidden =
13251-
enableViewTransition && (lanes & 335544064) === lanes),
13252-
(retryQueue = finishedWork.memoizedProps),
13253-
prevOffscreenDirectParentIsHidden &&
13252+
(ii = enableViewTransition && (lanes & 335544064) === lanes),
13253+
(_eventPayloads$ii2 = finishedWork.memoizedProps),
13254+
ii &&
1325413255
"none" !==
1325513256
getViewTransitionClassName(
13256-
retryQueue.default,
13257-
retryQueue.update
13257+
_eventPayloads$ii2.default,
13258+
_eventPayloads$ii2.update
1325813259
),
1325913260
recursivelyTraverseMutationEffects(root, finishedWork, lanes),
1326013261
commitReconciliationEffects(finishedWork),
13261-
prevOffscreenDirectParentIsHidden &&
13262+
ii &&
1326213263
null !== current &&
1326313264
viewTransitionMutationContext &&
1326413265
(finishedWork.flags |= 4),
@@ -18140,6 +18141,8 @@ __DEV__ &&
1814018141
dynamicFeatureFlags.disableLegacyContextForFunctionComponents,
1814118142
disableSchedulerTimeoutInWorkLoop =
1814218143
dynamicFeatureFlags.disableSchedulerTimeoutInWorkLoop,
18144+
enableEffectEventMutationPhase =
18145+
dynamicFeatureFlags.enableEffectEventMutationPhase,
1814318146
enableHiddenSubtreeInsertionEffectCleanup =
1814418147
dynamicFeatureFlags.enableHiddenSubtreeInsertionEffectCleanup,
1814518148
enableInfiniteRenderLoopDetection =
@@ -20386,10 +20389,10 @@ __DEV__ &&
2038620389
(function () {
2038720390
var internals = {
2038820391
bundleType: 1,
20389-
version: "19.3.0-www-classic-087a3469-20260204",
20392+
version: "19.3.0-www-classic-3aaab92a-20260204",
2039020393
rendererPackageName: "react-art",
2039120394
currentDispatcherRef: ReactSharedInternals,
20392-
reconcilerVersion: "19.3.0-www-classic-087a3469-20260204"
20395+
reconcilerVersion: "19.3.0-www-classic-3aaab92a-20260204"
2039320396
};
2039420397
internals.overrideHookState = overrideHookState;
2039520398
internals.overrideHookStateDeletePath = overrideHookStateDeletePath;
@@ -20424,7 +20427,7 @@ __DEV__ &&
2042420427
exports.Shape = Shape;
2042520428
exports.Surface = Surface;
2042620429
exports.Text = Text;
20427-
exports.version = "19.3.0-www-classic-087a3469-20260204";
20430+
exports.version = "19.3.0-www-classic-3aaab92a-20260204";
2042820431
"undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&
2042920432
"function" ===
2043020433
typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop &&

0 commit comments

Comments
 (0)