Skip to content

Commit e9aa959

Browse files
authored
change ReactBatchConfig.transition
Previously, ReactBatchConfig.transition was an number (1 = there is a transition, 0 = there isn't one). This PR changes this to a transition object (object = there is a transition, null = there isn't one) in preparation for transition tracing changes.
1 parent 51c8411 commit e9aa959

9 files changed

+90
-51
lines changed

packages/react-dom/src/events/ReactDOMEventListener.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ function dispatchDiscreteEvent(
117117
) {
118118
const previousPriority = getCurrentUpdatePriority();
119119
const prevTransition = ReactCurrentBatchConfig.transition;
120-
ReactCurrentBatchConfig.transition = 0;
120+
ReactCurrentBatchConfig.transition = null;
121121
try {
122122
setCurrentUpdatePriority(DiscreteEventPriority);
123123
dispatchEvent(domEventName, eventSystemFlags, container, nativeEvent);
@@ -135,7 +135,7 @@ function dispatchContinuousEvent(
135135
) {
136136
const previousPriority = getCurrentUpdatePriority();
137137
const prevTransition = ReactCurrentBatchConfig.transition;
138-
ReactCurrentBatchConfig.transition = 0;
138+
ReactCurrentBatchConfig.transition = null;
139139
try {
140140
setCurrentUpdatePriority(ContinuousEventPriority);
141141
dispatchEvent(domEventName, eventSystemFlags, container, nativeEvent);

packages/react-reconciler/src/ReactFiberHooks.new.js

+15-8
Original file line numberDiff line numberDiff line change
@@ -1928,7 +1928,7 @@ function mountDeferredValue<T>(value: T): T {
19281928
const [prevValue, setValue] = mountState(value);
19291929
mountEffect(() => {
19301930
const prevTransition = ReactCurrentBatchConfig.transition;
1931-
ReactCurrentBatchConfig.transition = 1;
1931+
ReactCurrentBatchConfig.transition = {};
19321932
try {
19331933
setValue(value);
19341934
} finally {
@@ -1942,7 +1942,7 @@ function updateDeferredValue<T>(value: T): T {
19421942
const [prevValue, setValue] = updateState(value);
19431943
updateEffect(() => {
19441944
const prevTransition = ReactCurrentBatchConfig.transition;
1945-
ReactCurrentBatchConfig.transition = 1;
1945+
ReactCurrentBatchConfig.transition = {};
19461946
try {
19471947
setValue(value);
19481948
} finally {
@@ -1956,7 +1956,7 @@ function rerenderDeferredValue<T>(value: T): T {
19561956
const [prevValue, setValue] = rerenderState(value);
19571957
updateEffect(() => {
19581958
const prevTransition = ReactCurrentBatchConfig.transition;
1959-
ReactCurrentBatchConfig.transition = 1;
1959+
ReactCurrentBatchConfig.transition = {};
19601960
try {
19611961
setValue(value);
19621962
} finally {
@@ -1975,28 +1975,35 @@ function startTransition(setPending, callback) {
19751975
setPending(true);
19761976

19771977
const prevTransition = ReactCurrentBatchConfig.transition;
1978-
ReactCurrentBatchConfig.transition = 1;
1978+
ReactCurrentBatchConfig.transition = {};
1979+
const currentTransition = ReactCurrentBatchConfig.transition;
1980+
1981+
if (__DEV__) {
1982+
ReactCurrentBatchConfig.transition._updatedFibers = new Set();
1983+
}
1984+
19791985
try {
19801986
setPending(false);
19811987
callback();
19821988
} finally {
19831989
setCurrentUpdatePriority(previousPriority);
1990+
19841991
ReactCurrentBatchConfig.transition = prevTransition;
19851992
if (__DEV__) {
19861993
if (
1987-
prevTransition !== 1 &&
1994+
prevTransition === null &&
19881995
warnOnSubscriptionInsideStartTransition &&
1989-
ReactCurrentBatchConfig._updatedFibers
1996+
currentTransition._updatedFibers
19901997
) {
1991-
const updatedFibersCount = ReactCurrentBatchConfig._updatedFibers.size;
1998+
const updatedFibersCount = currentTransition._updatedFibers.size;
19921999
if (updatedFibersCount > 10) {
19932000
console.warn(
19942001
'Detected a large number of updates inside startTransition. ' +
19952002
'If this is due to a subscription please re-write it to use React provided hooks. ' +
19962003
'Otherwise concurrent mode guarantees are off the table.',
19972004
);
19982005
}
1999-
ReactCurrentBatchConfig._updatedFibers.clear();
2006+
currentTransition._updatedFibers.clear();
20002007
}
20012008
}
20022009
}

packages/react-reconciler/src/ReactFiberHooks.old.js

+15-8
Original file line numberDiff line numberDiff line change
@@ -1928,7 +1928,7 @@ function mountDeferredValue<T>(value: T): T {
19281928
const [prevValue, setValue] = mountState(value);
19291929
mountEffect(() => {
19301930
const prevTransition = ReactCurrentBatchConfig.transition;
1931-
ReactCurrentBatchConfig.transition = 1;
1931+
ReactCurrentBatchConfig.transition = {};
19321932
try {
19331933
setValue(value);
19341934
} finally {
@@ -1942,7 +1942,7 @@ function updateDeferredValue<T>(value: T): T {
19421942
const [prevValue, setValue] = updateState(value);
19431943
updateEffect(() => {
19441944
const prevTransition = ReactCurrentBatchConfig.transition;
1945-
ReactCurrentBatchConfig.transition = 1;
1945+
ReactCurrentBatchConfig.transition = {};
19461946
try {
19471947
setValue(value);
19481948
} finally {
@@ -1956,7 +1956,7 @@ function rerenderDeferredValue<T>(value: T): T {
19561956
const [prevValue, setValue] = rerenderState(value);
19571957
updateEffect(() => {
19581958
const prevTransition = ReactCurrentBatchConfig.transition;
1959-
ReactCurrentBatchConfig.transition = 1;
1959+
ReactCurrentBatchConfig.transition = {};
19601960
try {
19611961
setValue(value);
19621962
} finally {
@@ -1975,28 +1975,35 @@ function startTransition(setPending, callback) {
19751975
setPending(true);
19761976

19771977
const prevTransition = ReactCurrentBatchConfig.transition;
1978-
ReactCurrentBatchConfig.transition = 1;
1978+
ReactCurrentBatchConfig.transition = {};
1979+
const currentTransition = ReactCurrentBatchConfig.transition;
1980+
1981+
if (__DEV__) {
1982+
ReactCurrentBatchConfig.transition._updatedFibers = new Set();
1983+
}
1984+
19791985
try {
19801986
setPending(false);
19811987
callback();
19821988
} finally {
19831989
setCurrentUpdatePriority(previousPriority);
1990+
19841991
ReactCurrentBatchConfig.transition = prevTransition;
19851992
if (__DEV__) {
19861993
if (
1987-
prevTransition !== 1 &&
1994+
prevTransition === null &&
19881995
warnOnSubscriptionInsideStartTransition &&
1989-
ReactCurrentBatchConfig._updatedFibers
1996+
currentTransition._updatedFibers
19901997
) {
1991-
const updatedFibersCount = ReactCurrentBatchConfig._updatedFibers.size;
1998+
const updatedFibersCount = currentTransition._updatedFibers.size;
19921999
if (updatedFibersCount > 10) {
19932000
console.warn(
19942001
'Detected a large number of updates inside startTransition. ' +
19952002
'If this is due to a subscription please re-write it to use React provided hooks. ' +
19962003
'Otherwise concurrent mode guarantees are off the table.',
19972004
);
19982005
}
1999-
ReactCurrentBatchConfig._updatedFibers.clear();
2006+
currentTransition._updatedFibers.clear();
20002007
}
20012008
}
20022009
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
/**
2+
* Copyright (c) Facebook, Inc. and its affiliates.
3+
*
4+
* This source code is licensed under the MIT license found in the
5+
* LICENSE file in the root directory of this source tree.
6+
*
7+
* @flow
8+
*/
9+
import type {Fiber} from 'react-reconciler/src/ReactInternalTypes';
10+
11+
export type Transition = {
12+
_updatedFibers?: Set<Fiber>,
13+
};

packages/react-reconciler/src/ReactFiberTransition.js

+3-2
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,12 @@
88
*/
99

1010
import ReactSharedInternals from 'shared/ReactSharedInternals';
11+
import type {Transition} from './ReactFiberTracingMarkerComponent.new';
1112

1213
const {ReactCurrentBatchConfig} = ReactSharedInternals;
1314

14-
export const NoTransition = 0;
15+
export const NoTransition = null;
1516

16-
export function requestCurrentTransition(): number {
17+
export function requestCurrentTransition(): Transition | null {
1718
return ReactCurrentBatchConfig.transition;
1819
}

packages/react-reconciler/src/ReactFiberWorkLoop.new.js

+14-9
Original file line numberDiff line numberDiff line change
@@ -401,9 +401,14 @@ export function requestUpdateLane(fiber: Fiber): Lane {
401401
if (
402402
__DEV__ &&
403403
warnOnSubscriptionInsideStartTransition &&
404-
ReactCurrentBatchConfig._updatedFibers
404+
ReactCurrentBatchConfig.transition !== null
405405
) {
406-
ReactCurrentBatchConfig._updatedFibers.add(fiber);
406+
const transition = ReactCurrentBatchConfig.transition;
407+
if (!transition._updatedFibers) {
408+
transition._updatedFibers = new Set();
409+
}
410+
411+
transition._updatedFibers.add(fiber);
407412
}
408413
// The algorithm for assigning an update to a lane should be stable for all
409414
// updates at the same priority within the same event. To do this, the
@@ -1246,7 +1251,7 @@ export function deferredUpdates<A>(fn: () => A): A {
12461251
const previousPriority = getCurrentUpdatePriority();
12471252
const prevTransition = ReactCurrentBatchConfig.transition;
12481253
try {
1249-
ReactCurrentBatchConfig.transition = 0;
1254+
ReactCurrentBatchConfig.transition = null;
12501255
setCurrentUpdatePriority(DefaultEventPriority);
12511256
return fn();
12521257
} finally {
@@ -1285,7 +1290,7 @@ export function discreteUpdates<A, B, C, D, R>(
12851290
const previousPriority = getCurrentUpdatePriority();
12861291
const prevTransition = ReactCurrentBatchConfig.transition;
12871292
try {
1288-
ReactCurrentBatchConfig.transition = 0;
1293+
ReactCurrentBatchConfig.transition = null;
12891294
setCurrentUpdatePriority(DiscreteEventPriority);
12901295
return fn(a, b, c, d);
12911296
} finally {
@@ -1320,7 +1325,7 @@ export function flushSync(fn) {
13201325
const prevTransition = ReactCurrentBatchConfig.transition;
13211326
const previousPriority = getCurrentUpdatePriority();
13221327
try {
1323-
ReactCurrentBatchConfig.transition = 0;
1328+
ReactCurrentBatchConfig.transition = null;
13241329
setCurrentUpdatePriority(DiscreteEventPriority);
13251330
if (fn) {
13261331
return fn();
@@ -1355,7 +1360,7 @@ export function flushControlled(fn: () => mixed): void {
13551360
const prevTransition = ReactCurrentBatchConfig.transition;
13561361
const previousPriority = getCurrentUpdatePriority();
13571362
try {
1358-
ReactCurrentBatchConfig.transition = 0;
1363+
ReactCurrentBatchConfig.transition = null;
13591364
setCurrentUpdatePriority(DiscreteEventPriority);
13601365
fn();
13611366
} finally {
@@ -1893,7 +1898,7 @@ function commitRoot(root: FiberRoot, recoverableErrors: null | Array<mixed>) {
18931898
const previousUpdateLanePriority = getCurrentUpdatePriority();
18941899
const prevTransition = ReactCurrentBatchConfig.transition;
18951900
try {
1896-
ReactCurrentBatchConfig.transition = 0;
1901+
ReactCurrentBatchConfig.transition = null;
18971902
setCurrentUpdatePriority(DiscreteEventPriority);
18981903
commitRootImpl(root, recoverableErrors, previousUpdateLanePriority);
18991904
} finally {
@@ -2028,7 +2033,7 @@ function commitRootImpl(
20282033

20292034
if (subtreeHasEffects || rootHasEffect) {
20302035
const prevTransition = ReactCurrentBatchConfig.transition;
2031-
ReactCurrentBatchConfig.transition = 0;
2036+
ReactCurrentBatchConfig.transition = null;
20322037
const previousPriority = getCurrentUpdatePriority();
20332038
setCurrentUpdatePriority(DiscreteEventPriority);
20342039

@@ -2283,7 +2288,7 @@ export function flushPassiveEffects(): boolean {
22832288
const prevTransition = ReactCurrentBatchConfig.transition;
22842289
const previousPriority = getCurrentUpdatePriority();
22852290
try {
2286-
ReactCurrentBatchConfig.transition = 0;
2291+
ReactCurrentBatchConfig.transition = null;
22872292
setCurrentUpdatePriority(priority);
22882293
return flushPassiveEffectsImpl();
22892294
} finally {

packages/react-reconciler/src/ReactFiberWorkLoop.old.js

+14-9
Original file line numberDiff line numberDiff line change
@@ -401,9 +401,14 @@ export function requestUpdateLane(fiber: Fiber): Lane {
401401
if (
402402
__DEV__ &&
403403
warnOnSubscriptionInsideStartTransition &&
404-
ReactCurrentBatchConfig._updatedFibers
404+
ReactCurrentBatchConfig.transition !== null
405405
) {
406-
ReactCurrentBatchConfig._updatedFibers.add(fiber);
406+
const transition = ReactCurrentBatchConfig.transition;
407+
if (!transition._updatedFibers) {
408+
transition._updatedFibers = new Set();
409+
}
410+
411+
transition._updatedFibers.add(fiber);
407412
}
408413
// The algorithm for assigning an update to a lane should be stable for all
409414
// updates at the same priority within the same event. To do this, the
@@ -1246,7 +1251,7 @@ export function deferredUpdates<A>(fn: () => A): A {
12461251
const previousPriority = getCurrentUpdatePriority();
12471252
const prevTransition = ReactCurrentBatchConfig.transition;
12481253
try {
1249-
ReactCurrentBatchConfig.transition = 0;
1254+
ReactCurrentBatchConfig.transition = null;
12501255
setCurrentUpdatePriority(DefaultEventPriority);
12511256
return fn();
12521257
} finally {
@@ -1285,7 +1290,7 @@ export function discreteUpdates<A, B, C, D, R>(
12851290
const previousPriority = getCurrentUpdatePriority();
12861291
const prevTransition = ReactCurrentBatchConfig.transition;
12871292
try {
1288-
ReactCurrentBatchConfig.transition = 0;
1293+
ReactCurrentBatchConfig.transition = null;
12891294
setCurrentUpdatePriority(DiscreteEventPriority);
12901295
return fn(a, b, c, d);
12911296
} finally {
@@ -1320,7 +1325,7 @@ export function flushSync(fn) {
13201325
const prevTransition = ReactCurrentBatchConfig.transition;
13211326
const previousPriority = getCurrentUpdatePriority();
13221327
try {
1323-
ReactCurrentBatchConfig.transition = 0;
1328+
ReactCurrentBatchConfig.transition = null;
13241329
setCurrentUpdatePriority(DiscreteEventPriority);
13251330
if (fn) {
13261331
return fn();
@@ -1355,7 +1360,7 @@ export function flushControlled(fn: () => mixed): void {
13551360
const prevTransition = ReactCurrentBatchConfig.transition;
13561361
const previousPriority = getCurrentUpdatePriority();
13571362
try {
1358-
ReactCurrentBatchConfig.transition = 0;
1363+
ReactCurrentBatchConfig.transition = null;
13591364
setCurrentUpdatePriority(DiscreteEventPriority);
13601365
fn();
13611366
} finally {
@@ -1893,7 +1898,7 @@ function commitRoot(root: FiberRoot, recoverableErrors: null | Array<mixed>) {
18931898
const previousUpdateLanePriority = getCurrentUpdatePriority();
18941899
const prevTransition = ReactCurrentBatchConfig.transition;
18951900
try {
1896-
ReactCurrentBatchConfig.transition = 0;
1901+
ReactCurrentBatchConfig.transition = null;
18971902
setCurrentUpdatePriority(DiscreteEventPriority);
18981903
commitRootImpl(root, recoverableErrors, previousUpdateLanePriority);
18991904
} finally {
@@ -2028,7 +2033,7 @@ function commitRootImpl(
20282033

20292034
if (subtreeHasEffects || rootHasEffect) {
20302035
const prevTransition = ReactCurrentBatchConfig.transition;
2031-
ReactCurrentBatchConfig.transition = 0;
2036+
ReactCurrentBatchConfig.transition = null;
20322037
const previousPriority = getCurrentUpdatePriority();
20332038
setCurrentUpdatePriority(DiscreteEventPriority);
20342039

@@ -2283,7 +2288,7 @@ export function flushPassiveEffects(): boolean {
22832288
const prevTransition = ReactCurrentBatchConfig.transition;
22842289
const previousPriority = getCurrentUpdatePriority();
22852290
try {
2286-
ReactCurrentBatchConfig.transition = 0;
2291+
ReactCurrentBatchConfig.transition = null;
22872292
setCurrentUpdatePriority(priority);
22882293
return flushPassiveEffectsImpl();
22892294
} finally {

packages/react/src/ReactCurrentBatchConfig.js

+3-8
Original file line numberDiff line numberDiff line change
@@ -7,22 +7,17 @@
77
* @flow
88
*/
99

10-
import type {Fiber} from 'react-reconciler/src/ReactInternalTypes';
10+
import type {Transition} from 'react-reconciler/src/ReactFiberTracingMarkerComponent.new';
1111

1212
type BatchConfig = {
13-
transition: number,
14-
_updatedFibers?: Set<Fiber>,
13+
transition: Transition | null,
1514
};
1615
/**
1716
* Keeps track of the current batch's configuration such as how long an update
1817
* should suspend for if it needs to.
1918
*/
2019
const ReactCurrentBatchConfig: BatchConfig = {
21-
transition: 0,
20+
transition: null,
2221
};
2322

24-
if (__DEV__) {
25-
ReactCurrentBatchConfig._updatedFibers = new Set();
26-
}
27-
2823
export default ReactCurrentBatchConfig;

0 commit comments

Comments
 (0)