From a4789b8ba4b207a6c1bde4d9dd663c6adf5fa6ee Mon Sep 17 00:00:00 2001 From: Luna Date: Wed, 15 Jul 2020 16:39:51 -0700 Subject: [PATCH] use while loop instead of recursion for siblings --- .../src/ReactFiberWorkLoop.new.js | 186 +++++++++--------- 1 file changed, 95 insertions(+), 91 deletions(-) diff --git a/packages/react-reconciler/src/ReactFiberWorkLoop.new.js b/packages/react-reconciler/src/ReactFiberWorkLoop.new.js index 423f0d2bef17..7c79a092860b 100644 --- a/packages/react-reconciler/src/ReactFiberWorkLoop.new.js +++ b/packages/react-reconciler/src/ReactFiberWorkLoop.new.js @@ -2140,36 +2140,36 @@ function commitRootImpl(root, renderPriorityLevel) { return null; } -function commitBeforeMutationEffects(fiber: Fiber) { - if (fiber.deletions !== null) { - commitBeforeMutationEffectsDeletions(fiber.deletions); - } - - if (fiber.child !== null) { - const primarySubtreeTag = fiber.subtreeTag & BeforeMutation; - if (primarySubtreeTag !== NoSubtreeTag) { - commitBeforeMutationEffects(fiber.child); +function commitBeforeMutationEffects(firstChild: Fiber) { + let fiber = firstChild; + while (fiber !== null) { + if (fiber.deletions !== null) { + commitBeforeMutationEffectsDeletions(fiber.deletions); } - } - if (__DEV__) { - setCurrentDebugFiberInDEV(fiber); - invokeGuardedCallback(null, commitBeforeMutationEffectsImpl, null, fiber); - if (hasCaughtError()) { - const error = clearCaughtError(); - captureCommitPhaseError(fiber, error); - } - resetCurrentDebugFiberInDEV(); - } else { - try { - commitBeforeMutationEffectsImpl(fiber); - } catch (error) { - captureCommitPhaseError(fiber, error); + if (fiber.child !== null) { + const primarySubtreeTag = fiber.subtreeTag & BeforeMutation; + if (primarySubtreeTag !== NoSubtreeTag) { + commitBeforeMutationEffects(fiber.child); + } } - } - if (fiber.sibling !== null) { - commitBeforeMutationEffects(fiber.sibling); + if (__DEV__) { + setCurrentDebugFiberInDEV(fiber); + invokeGuardedCallback(null, commitBeforeMutationEffectsImpl, null, fiber); + if (hasCaughtError()) { + const error = clearCaughtError(); + captureCommitPhaseError(fiber, error); + } + resetCurrentDebugFiberInDEV(); + } else { + try { + commitBeforeMutationEffectsImpl(fiber); + } catch (error) { + captureCommitPhaseError(fiber, error); + } + } + fiber = fiber.sibling; } } @@ -2226,49 +2226,53 @@ function commitBeforeMutationEffectsDeletions(deletions: Array) { } function commitMutationEffects( - fiber: Fiber, + firstChild: Fiber, root: FiberRoot, renderPriorityLevel, ) { - if (fiber.deletions !== null) { - commitMutationEffectsDeletions(fiber.deletions, root, renderPriorityLevel); - - // TODO (effects) Don't clear this yet; we may need to cleanup passive effects - fiber.deletions = null; - } + let fiber = firstChild; + while (fiber !== null) { + if (fiber.deletions !== null) { + commitMutationEffectsDeletions( + fiber.deletions, + root, + renderPriorityLevel, + ); - if (fiber.child !== null) { - const primarySubtreeTag = fiber.subtreeTag & Mutation; - if (primarySubtreeTag !== NoSubtreeTag) { - commitMutationEffects(fiber.child, root, renderPriorityLevel); + // TODO (effects) Don't clear this yet; we may need to cleanup passive effects + fiber.deletions = null; } - } - if (__DEV__) { - setCurrentDebugFiberInDEV(fiber); - invokeGuardedCallback( - null, - commitMutationEffectsImpl, - null, - fiber, - root, - renderPriorityLevel, - ); - if (hasCaughtError()) { - const error = clearCaughtError(); - captureCommitPhaseError(fiber, error); - } - resetCurrentDebugFiberInDEV(); - } else { - try { - commitMutationEffectsImpl(fiber, root, renderPriorityLevel); - } catch (error) { - captureCommitPhaseError(fiber, error); + if (fiber.child !== null) { + const primarySubtreeTag = fiber.subtreeTag & Mutation; + if (primarySubtreeTag !== NoSubtreeTag) { + commitMutationEffects(fiber.child, root, renderPriorityLevel); + } } - } - if (fiber.sibling !== null) { - commitMutationEffects(fiber.sibling, root, renderPriorityLevel); + if (__DEV__) { + setCurrentDebugFiberInDEV(fiber); + invokeGuardedCallback( + null, + commitMutationEffectsImpl, + null, + fiber, + root, + renderPriorityLevel, + ); + if (hasCaughtError()) { + const error = clearCaughtError(); + captureCommitPhaseError(fiber, error); + } + resetCurrentDebugFiberInDEV(); + } else { + try { + commitMutationEffectsImpl(fiber, root, renderPriorityLevel); + } catch (error) { + captureCommitPhaseError(fiber, error); + } + } + fiber = fiber.sibling; } } @@ -2375,42 +2379,42 @@ function commitMutationEffectsDeletions( } function commitLayoutEffects( - fiber: Fiber, + firstChild: Fiber, root: FiberRoot, committedLanes: Lanes, ) { - if (fiber.child !== null) { - const primarySubtreeTag = fiber.subtreeTag & Layout; - if (primarySubtreeTag !== NoSubtreeTag) { - commitLayoutEffects(fiber.child, root, committedLanes); + let fiber = firstChild; + while (fiber !== null) { + if (fiber.child !== null) { + const primarySubtreeTag = fiber.subtreeTag & Layout; + if (primarySubtreeTag !== NoSubtreeTag) { + commitLayoutEffects(fiber.child, root, committedLanes); + } } - } - if (__DEV__) { - setCurrentDebugFiberInDEV(fiber); - invokeGuardedCallback( - null, - commitLayoutEffectsImpl, - null, - fiber, - root, - committedLanes, - ); - if (hasCaughtError()) { - const error = clearCaughtError(); - captureCommitPhaseError(fiber, error); - } - resetCurrentDebugFiberInDEV(); - } else { - try { - commitLayoutEffectsImpl(fiber, root, committedLanes); - } catch (error) { - captureCommitPhaseError(fiber, error); + if (__DEV__) { + setCurrentDebugFiberInDEV(fiber); + invokeGuardedCallback( + null, + commitLayoutEffectsImpl, + null, + fiber, + root, + committedLanes, + ); + if (hasCaughtError()) { + const error = clearCaughtError(); + captureCommitPhaseError(fiber, error); + } + resetCurrentDebugFiberInDEV(); + } else { + try { + commitLayoutEffectsImpl(fiber, root, committedLanes); + } catch (error) { + captureCommitPhaseError(fiber, error); + } } - } - - if (fiber.sibling !== null) { - commitLayoutEffects(fiber.sibling, root, committedLanes); + fiber = fiber.sibling; } }