Skip to content

Commit a6b5256

Browse files
author
Brian Vaughn
authored
Refactored recursive strict effects method to be iterative (#20642)
1 parent 3957853 commit a6b5256

File tree

2 files changed

+40
-22
lines changed

2 files changed

+40
-22
lines changed

packages/react-reconciler/src/ReactFiberWorkLoop.new.js

+19-11
Original file line numberDiff line numberDiff line change
@@ -2551,7 +2551,6 @@ function commitDoubleInvokeEffectsInDEV(
25512551
}
25522552
}
25532553

2554-
// TODO (strict effects) Rewrite to be iterative
25552554
function invokeEffectsInDev(
25562555
firstChild: Fiber,
25572556
fiberFlags: Flags,
@@ -2560,19 +2559,28 @@ function invokeEffectsInDev(
25602559
if (__DEV__ && enableDoubleInvokingEffects) {
25612560
// We don't need to re-check for legacy roots here.
25622561
// This function will not be called within legacy roots.
2563-
let fiber = firstChild;
2564-
while (fiber !== null) {
2565-
if (fiber.child !== null) {
2566-
const primarySubtreeFlag = fiber.subtreeFlags & fiberFlags;
2567-
if (primarySubtreeFlag !== NoFlags) {
2568-
invokeEffectsInDev(fiber.child, fiberFlags, invokeEffectFn);
2562+
2563+
let current = firstChild;
2564+
let subtreeRoot = null;
2565+
while (current !== null) {
2566+
const primarySubtreeFlag = current.subtreeFlags & fiberFlags;
2567+
if (
2568+
current !== subtreeRoot &&
2569+
current.child !== null &&
2570+
primarySubtreeFlag !== NoFlags
2571+
) {
2572+
current = current.child;
2573+
} else {
2574+
if ((current.flags & fiberFlags) !== NoFlags) {
2575+
invokeEffectFn(current);
25692576
}
2570-
}
25712577

2572-
if ((fiber.flags & fiberFlags) !== NoFlags) {
2573-
invokeEffectFn(fiber);
2578+
if (current.sibling !== null) {
2579+
current = current.sibling;
2580+
} else {
2581+
current = subtreeRoot = current.return;
2582+
}
25742583
}
2575-
fiber = fiber.sibling;
25762584
}
25772585
}
25782586
}

packages/react-reconciler/src/ReactFiberWorkLoop.old.js

+21-11
Original file line numberDiff line numberDiff line change
@@ -2708,26 +2708,36 @@ function commitDoubleInvokeEffectsInDEV(
27082708
}
27092709
}
27102710

2711-
// TODO (strict effects) Rewrite to be iterative
27122711
function invokeEffectsInDev(
27132712
firstChild: Fiber,
27142713
fiberFlags: Flags,
27152714
invokeEffectFn: (fiber: Fiber) => void,
27162715
): void {
27172716
if (__DEV__ && enableDoubleInvokingEffects) {
2718-
let fiber = firstChild;
2719-
while (fiber !== null) {
2720-
if (fiber.child !== null) {
2721-
const primarySubtreeFlag = fiber.subtreeFlags & fiberFlags;
2722-
if (primarySubtreeFlag !== NoFlags) {
2723-
invokeEffectsInDev(fiber.child, fiberFlags, invokeEffectFn);
2717+
// We don't need to re-check for legacy roots here.
2718+
// This function will not be called within legacy roots.
2719+
2720+
let current = firstChild;
2721+
let subtreeRoot = null;
2722+
while (current !== null) {
2723+
const primarySubtreeFlag = current.subtreeFlags & fiberFlags;
2724+
if (
2725+
current !== subtreeRoot &&
2726+
current.child !== null &&
2727+
primarySubtreeFlag !== NoFlags
2728+
) {
2729+
current = current.child;
2730+
} else {
2731+
if ((current.flags & fiberFlags) !== NoFlags) {
2732+
invokeEffectFn(current);
27242733
}
2725-
}
27262734

2727-
if ((fiber.flags & fiberFlags) !== NoFlags) {
2728-
invokeEffectFn(fiber);
2735+
if (current.sibling !== null) {
2736+
current = current.sibling;
2737+
} else {
2738+
current = subtreeRoot = current.return;
2739+
}
27292740
}
2730-
fiber = fiber.sibling;
27312741
}
27322742
}
27332743
}

0 commit comments

Comments
 (0)