@@ -11,14 +11,16 @@ import type {Fiber} from './ReactFiber';
1111import type { ReactContext } from 'shared/ReactTypes' ;
1212import type { StackCursor , Stack } from './ReactFiberStack' ;
1313
14- import warning from 'fbjs/lib/warning' ;
15-
1614export type NewContext = {
1715 pushProvider ( providerFiber : Fiber ) : void ,
1816 popProvider ( providerFiber : Fiber ) : void ,
17+ getContextCurrentValue ( context : ReactContext < any > ) : any ,
18+ getContextChangedBits ( context : ReactContext < any > ) : number ,
1919} ;
2020
21- export default function ( stack : Stack ) {
21+ import warning from 'fbjs/lib/warning' ;
22+
23+ export default function ( stack : Stack , isPrimaryRenderer : boolean ) {
2224 const { createCursor, push, pop} = stack ;
2325
2426 const providerCursor : StackCursor < Fiber | null > = createCursor ( null ) ;
@@ -34,21 +36,38 @@ export default function(stack: Stack) {
3436 function pushProvider(providerFiber: Fiber): void {
3537 const context : ReactContext < any > = providerFiber . type . _context ;
3638
37- push ( changedBitsCursor , context . _changedBits , providerFiber ) ;
38- push ( valueCursor , context . _currentValue , providerFiber ) ;
39- push ( providerCursor , providerFiber , providerFiber ) ;
40-
41- context . _currentValue = providerFiber . pendingProps . value ;
42- context . _changedBits = providerFiber . stateNode ;
43-
44- if ( __DEV__ ) {
45- warning (
46- context . _currentRenderer === null ||
47- context . _currentRenderer === rendererSigil ,
48- 'Detected multiple renderers concurrently rendering the ' +
49- 'same context provider. This is currently unsupported.' ,
50- ) ;
51- context . _currentRenderer = rendererSigil ;
39+ if ( isPrimaryRenderer ) {
40+ push ( changedBitsCursor , context . _changedBits , providerFiber ) ;
41+ push ( valueCursor , context . _currentValue , providerFiber ) ;
42+ push ( providerCursor , providerFiber , providerFiber ) ;
43+
44+ context . _currentValue = providerFiber . pendingProps . value ;
45+ context . _changedBits = providerFiber . stateNode ;
46+ if ( __DEV__ ) {
47+ warning (
48+ context . _currentRenderer === null ||
49+ context . _currentRenderer === rendererSigil ,
50+ 'Detected multiple renderers concurrently rendering the ' +
51+ 'same context provider. This is currently unsupported.' ,
52+ ) ;
53+ context . _currentRenderer = rendererSigil ;
54+ }
55+ } else {
56+ push ( changedBitsCursor , context . _changedBits2 , providerFiber ) ;
57+ push ( valueCursor , context . _currentValue2 , providerFiber ) ;
58+ push ( providerCursor , providerFiber , providerFiber ) ;
59+
60+ context . _currentValue2 = providerFiber . pendingProps . value ;
61+ context . _changedBits2 = providerFiber . stateNode ;
62+ if ( __DEV__ ) {
63+ warning (
64+ context . _currentRenderer2 === null ||
65+ context . _currentRenderer2 === rendererSigil ,
66+ 'Detected multiple renderers concurrently rendering the ' +
67+ 'same context provider. This is currently unsupported.' ,
68+ ) ;
69+ context . _currentRenderer2 = rendererSigil ;
70+ }
5271 }
5372 }
5473
@@ -61,12 +80,27 @@ export default function(stack: Stack) {
6180 pop ( changedBitsCursor , providerFiber ) ;
6281
6382 const context : ReactContext < any > = providerFiber . type . _context ;
64- context . _currentValue = currentValue ;
65- context . _changedBits = changedBits ;
83+ if ( isPrimaryRenderer ) {
84+ context . _currentValue = currentValue ;
85+ context . _changedBits = changedBits ;
86+ } else {
87+ context . _currentValue2 = currentValue ;
88+ context . _changedBits2 = changedBits ;
89+ }
90+ }
91+
92+ function getContextCurrentValue ( context : ReactContext < any > ) : any {
93+ return isPrimaryRenderer ? context . _currentValue : context . _currentValue2 ;
94+ }
95+
96+ function getContextChangedBits ( context : ReactContext < any > ) : number {
97+ return isPrimaryRenderer ? context . _changedBits : context . _changedBits2 ;
6698 }
6799
68100 return {
69101 pushProvider ,
70102 popProvider ,
103+ getContextCurrentValue ,
104+ getContextChangedBits ,
71105 } ;
72106}
0 commit comments