Skip to content

Commit 267dea6

Browse files
committed
Restructure recursion into two functions
1 parent f1579c2 commit 267dea6

File tree

2 files changed

+48
-44
lines changed

2 files changed

+48
-44
lines changed

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

Lines changed: 24 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3001,42 +3001,44 @@ function flushRenderPhaseStrictModeWarningsInDEV() {
30013001

30023002
function recursivelyTraverseAndDoubleInvokeEffectsInDEV(
30033003
root: FiberRoot,
3004-
fiber: Fiber,
3004+
parentFiber: Fiber,
3005+
isInStrictMode: boolean,
30053006
hasPassiveEffects: boolean,
3006-
doubleInvokeEffects: boolean,
30073007
) {
3008-
if (fiber.type === REACT_STRICT_MODE_TYPE) {
3009-
doubleInvokeEffects = true;
3008+
let child = parentFiber.child;
3009+
while (child !== null) {
3010+
doubleInvokeEffectsInDEV(root, child, isInStrictMode, hasPassiveEffects);
3011+
child = child.sibling;
30103012
}
3013+
}
30113014

3015+
function doubleInvokeEffectsInDEV(
3016+
root: FiberRoot,
3017+
fiber: Fiber,
3018+
parentIsInStrictMode: boolean,
3019+
hasPassiveEffects: boolean,
3020+
) {
3021+
const isStrictModeFiber = fiber.type === REACT_STRICT_MODE_TYPE;
3022+
const isInStrictMode = parentIsInStrictMode || isStrictModeFiber;
30123023
if (fiber.flags & PlacementDEV || fiber.tag === OffscreenComponent) {
3013-
if (doubleInvokeEffects) {
3024+
if (isInStrictMode) {
30143025
disappearLayoutEffects(fiber);
30153026
}
3016-
if (hasPassiveEffects && doubleInvokeEffects) {
3027+
if (hasPassiveEffects && isInStrictMode) {
30173028
disconnectPassiveEffect(fiber);
30183029
}
3019-
if (doubleInvokeEffects) {
3020-
reappearLayoutEffects(root, fiber.alternate, fiber, NoLanes, false);
3030+
if (isInStrictMode) {
3031+
reappearLayoutEffects(root, fiber.alternate, fiber, false);
30213032
}
3022-
if (hasPassiveEffects && doubleInvokeEffects) {
3033+
if (hasPassiveEffects && isInStrictMode) {
30233034
reconnectPassiveEffects(root, fiber, NoLanes, null, false);
30243035
}
3025-
} else if (fiber.child !== null) {
3026-
recursivelyTraverseAndDoubleInvokeEffectsInDEV(
3027-
root,
3028-
fiber.child,
3029-
hasPassiveEffects,
3030-
doubleInvokeEffects,
3031-
);
3032-
}
3033-
3034-
if (fiber.sibling !== null) {
3036+
} else {
30353037
recursivelyTraverseAndDoubleInvokeEffectsInDEV(
30363038
root,
3037-
fiber.sibling,
3039+
fiber,
3040+
isInStrictMode,
30383041
hasPassiveEffects,
3039-
doubleInvokeEffects,
30403042
);
30413043
}
30423044
}
@@ -3060,8 +3062,8 @@ function commitDoubleInvokeEffectsInDEV(
30603062
recursivelyTraverseAndDoubleInvokeEffectsInDEV(
30613063
root,
30623064
root.current,
3063-
hasPassiveEffects,
30643065
doubleInvokeEffects,
3066+
hasPassiveEffects,
30653067
);
30663068
}
30673069
}

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

Lines changed: 24 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3001,42 +3001,44 @@ function flushRenderPhaseStrictModeWarningsInDEV() {
30013001

30023002
function recursivelyTraverseAndDoubleInvokeEffectsInDEV(
30033003
root: FiberRoot,
3004-
fiber: Fiber,
3004+
parentFiber: Fiber,
3005+
isInStrictMode: boolean,
30053006
hasPassiveEffects: boolean,
3006-
doubleInvokeEffects: boolean,
30073007
) {
3008-
if (fiber.type === REACT_STRICT_MODE_TYPE) {
3009-
doubleInvokeEffects = true;
3008+
let child = parentFiber.child;
3009+
while (child !== null) {
3010+
doubleInvokeEffectsInDEV(root, child, isInStrictMode, hasPassiveEffects);
3011+
child = child.sibling;
30103012
}
3013+
}
30113014

3015+
function doubleInvokeEffectsInDEV(
3016+
root: FiberRoot,
3017+
fiber: Fiber,
3018+
parentIsInStrictMode: boolean,
3019+
hasPassiveEffects: boolean,
3020+
) {
3021+
const isStrictModeFiber = fiber.type === REACT_STRICT_MODE_TYPE;
3022+
const isInStrictMode = parentIsInStrictMode || isStrictModeFiber;
30123023
if (fiber.flags & PlacementDEV || fiber.tag === OffscreenComponent) {
3013-
if (doubleInvokeEffects) {
3024+
if (isInStrictMode) {
30143025
disappearLayoutEffects(fiber);
30153026
}
3016-
if (hasPassiveEffects && doubleInvokeEffects) {
3027+
if (hasPassiveEffects && isInStrictMode) {
30173028
disconnectPassiveEffect(fiber);
30183029
}
3019-
if (doubleInvokeEffects) {
3020-
reappearLayoutEffects(root, fiber.alternate, fiber, NoLanes, false);
3030+
if (isInStrictMode) {
3031+
reappearLayoutEffects(root, fiber.alternate, fiber, false);
30213032
}
3022-
if (hasPassiveEffects && doubleInvokeEffects) {
3033+
if (hasPassiveEffects && isInStrictMode) {
30233034
reconnectPassiveEffects(root, fiber, NoLanes, null, false);
30243035
}
3025-
} else if (fiber.child !== null) {
3026-
recursivelyTraverseAndDoubleInvokeEffectsInDEV(
3027-
root,
3028-
fiber.child,
3029-
hasPassiveEffects,
3030-
doubleInvokeEffects,
3031-
);
3032-
}
3033-
3034-
if (fiber.sibling !== null) {
3036+
} else {
30353037
recursivelyTraverseAndDoubleInvokeEffectsInDEV(
30363038
root,
3037-
fiber.sibling,
3039+
fiber,
3040+
isInStrictMode,
30383041
hasPassiveEffects,
3039-
doubleInvokeEffects,
30403042
);
30413043
}
30423044
}
@@ -3060,8 +3062,8 @@ function commitDoubleInvokeEffectsInDEV(
30603062
recursivelyTraverseAndDoubleInvokeEffectsInDEV(
30613063
root,
30623064
root.current,
3063-
hasPassiveEffects,
30643065
doubleInvokeEffects,
3066+
hasPassiveEffects,
30653067
);
30663068
}
30673069
}

0 commit comments

Comments
 (0)