@@ -11,44 +11,37 @@ 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+ export default function ( stack : Stack , isPrimaryRenderer : boolean ) {
2222 const { createCursor, push, pop} = stack ;
2323
2424 const providerCursor : StackCursor < Fiber | null > = createCursor ( null ) ;
2525 const valueCursor : StackCursor < mixed > = createCursor(null);
2626 const changedBitsCursor: StackCursor< number > = createCursor(0);
2727
28- let rendererSigil;
29- if (__DEV__) {
30- // Use this to detect multiple renderers using the same context
31- rendererSigil = { } ;
32- }
33-
3428 function pushProvider(providerFiber: Fiber): void {
3529 const context : ReactContext < any > = providerFiber . type . _context ;
3630
37- push ( changedBitsCursor , context . _changedBits , providerFiber ) ;
38- push ( valueCursor , context . _currentValue , providerFiber ) ;
39- push ( providerCursor , providerFiber , providerFiber ) ;
31+ if ( isPrimaryRenderer ) {
32+ push ( changedBitsCursor , context . _changedBits , providerFiber ) ;
33+ push ( valueCursor , context . _currentValue , providerFiber ) ;
34+ push ( providerCursor , providerFiber , providerFiber ) ;
4035
41- context . _currentValue = providerFiber . pendingProps . value ;
42- context . _changedBits = providerFiber . stateNode ;
36+ context . _currentValue = providerFiber . pendingProps . value ;
37+ context . _changedBits = providerFiber . stateNode ;
38+ } else {
39+ push ( changedBitsCursor , context . _changedBits_secondary , providerFiber ) ;
40+ push ( valueCursor , context . _currentValue_secondary , providerFiber ) ;
41+ push ( providerCursor , providerFiber , providerFiber ) ;
4342
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 ;
43+ context . _currentValue_secondary = providerFiber . pendingProps . value ;
44+ context . _changedBits_secondary = providerFiber . stateNode ;
5245 }
5346 }
5447
@@ -61,12 +54,31 @@ export default function(stack: Stack) {
6154 pop ( changedBitsCursor , providerFiber ) ;
6255
6356 const context : ReactContext < any > = providerFiber . type . _context ;
64- context . _currentValue = currentValue ;
65- context . _changedBits = changedBits ;
57+ if ( isPrimaryRenderer ) {
58+ context . _currentValue = currentValue ;
59+ context . _changedBits = changedBits ;
60+ } else {
61+ context . _currentValue_secondary = currentValue ;
62+ context . _changedBits_secondary = changedBits ;
63+ }
64+ }
65+
66+ function getContextCurrentValue ( context : ReactContext < any > ): any {
67+ return isPrimaryRenderer
68+ ? context . _currentValue
69+ : context . _currentValue_secondary ;
70+ }
71+
72+ function getContextChangedBits(context: ReactContext< any > ): number {
73+ return isPrimaryRenderer
74+ ? context . _changedBits
75+ : context . _changedBits_secondary ;
6676 }
6777
6878 return {
6979 pushProvider ,
7080 popProvider ,
81+ getContextCurrentValue ,
82+ getContextChangedBits ,
7183 } ;
7284}
0 commit comments