@@ -28,7 +28,7 @@ import {ContextProvider} from 'shared/ReactTypeOfWork';
28
28
29
29
import invariant from 'shared/invariant' ;
30
30
31
- const providerCursor : StackCursor < Fiber | null > = createCursor ( null ) ;
31
+ const someContextChangedCursor : StackCursor < boolean > = createCursor(false );
32
32
const valueCursor: StackCursor< mixed > = createCursor(null);
33
33
const changedBitsCursor: StackCursor< number > = createCursor(0);
34
34
@@ -48,10 +48,16 @@ export function pushProvider(providerFiber: Fiber): void {
48
48
if ( isPrimaryRenderer ) {
49
49
push ( changedBitsCursor , context . _changedBits , providerFiber ) ;
50
50
push ( valueCursor , context . _currentValue , providerFiber ) ;
51
- push ( providerCursor , providerFiber , providerFiber ) ;
52
51
53
52
context . _currentValue = providerFiber . pendingProps . value ;
54
- context . _changedBits = providerFiber . stateNode ;
53
+ const changedBits = ( context . _changedBits = providerFiber . stateNode ) ;
54
+
55
+ push (
56
+ someContextChangedCursor ,
57
+ someContextChangedCursor . current || changedBits !== 0 ,
58
+ providerFiber ,
59
+ ) ;
60
+
55
61
if ( __DEV__ ) {
56
62
warning (
57
63
context . _currentRenderer === undefined ||
@@ -65,10 +71,16 @@ export function pushProvider(providerFiber: Fiber): void {
65
71
} else {
66
72
push ( changedBitsCursor , context . _changedBits2 , providerFiber ) ;
67
73
push ( valueCursor , context . _currentValue2 , providerFiber ) ;
68
- push ( providerCursor , providerFiber , providerFiber ) ;
69
74
70
75
context . _currentValue2 = providerFiber . pendingProps . value ;
71
- context . _changedBits2 = providerFiber . stateNode ;
76
+ const changedBits = ( context . _changedBits2 = providerFiber . stateNode ) ;
77
+
78
+ push (
79
+ someContextChangedCursor ,
80
+ someContextChangedCursor . current || changedBits !== 0 ,
81
+ providerFiber ,
82
+ ) ;
83
+
72
84
if ( __DEV__ ) {
73
85
warning (
74
86
context . _currentRenderer2 === undefined ||
@@ -86,7 +98,7 @@ export function popProvider(providerFiber: Fiber): void {
86
98
const changedBits = changedBitsCursor . current ;
87
99
const currentValue = valueCursor . current ;
88
100
89
- pop ( providerCursor , providerFiber ) ;
101
+ pop ( someContextChangedCursor , providerFiber ) ;
90
102
pop ( valueCursor , providerFiber ) ;
91
103
pop ( changedBitsCursor , providerFiber ) ;
92
104
@@ -207,11 +219,17 @@ export function prepareToReadContext(
207
219
// Reset the work-in-progress list
208
220
workInProgress . firstContextDependency = null ;
209
221
222
+ // Check the global flag to see if there are any pending contexts. This is
223
+ // optimizes for the normal case where no contexts have updated at all.
224
+ if ( someContextChangedCursor . current === false ) {
225
+ return false ;
226
+ }
227
+
228
+ let hasPendingContext = false ;
210
229
// Iterate through the context dependencies and see if there were any
211
230
// changes. If so, continue propagating the context change by scanning
212
231
// the child subtree.
213
232
let dependency = memoizedFirstContextDependency ;
214
- let hasPendingContext = false ;
215
233
do {
216
234
const context = dependency . context ;
217
235
const changedBits = isPrimaryRenderer
0 commit comments