@@ -2551,7 +2551,6 @@ function commitDoubleInvokeEffectsInDEV(
25512551 }
25522552}
25532553
2554- // TODO (strict effects) Rewrite to be iterative
25552554function 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}
0 commit comments