Skip to content
Merged
Prev Previous commit
Use global state to track currently processing queue in DEV
  • Loading branch information
acdlite committed Apr 23, 2018
commit e4ce36312a47a83c79bce470e31b9c39e9af708c
8 changes: 7 additions & 1 deletion packages/react-reconciler/src/ReactFiberScheduler.js
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ import {
import {AsyncMode} from './ReactTypeOfMode';
import ReactFiberLegacyContext from './ReactFiberContext';
import ReactFiberNewContext from './ReactFiberNewContext';
import {enqueueUpdate} from './ReactUpdateQueue';
import {enqueueUpdate, resetCurrentlyProcessingQueue} from './ReactUpdateQueue';
import {createCapturedValue} from './ReactCapturedValue';
import ReactFiberStack from './ReactFiberStack';

Expand Down Expand Up @@ -960,6 +960,12 @@ export default function<T, P, I, TI, HI, PI, C, CC, CX, PL>(
break;
}

if (__DEV__) {
// Reset global debug state
// We assume this is defined in DEV
(resetCurrentlyProcessingQueue: any)();
}

if (__DEV__ && replayFailedUnitOfWorkWithInvokeGuardedCallback) {
const failedUnitOfWork = nextUnitOfWork;
replayUnitOfWork(failedUnitOfWork, thrownValue, isAsync);
Expand Down
22 changes: 10 additions & 12 deletions packages/react-reconciler/src/ReactUpdateQueue.js
Original file line number Diff line number Diff line change
Expand Up @@ -134,9 +134,6 @@ export type UpdateQueue<State> = {

// TODO: Workaround for lack of tuples. Could use global state instead.
hasForceUpdate: boolean,

// DEV-only
isProcessing?: boolean,
};

export const UpdateState = 0;
Expand All @@ -145,8 +142,14 @@ export const ForceUpdate = 2;
export const CaptureUpdate = 3;

let didWarnUpdateInsideUpdate;
let currentlyProcessingQueue;
export let resetCurrentlyProcessingQueue;
if (__DEV__) {
didWarnUpdateInsideUpdate = false;
currentlyProcessingQueue = null;
resetCurrentlyProcessingQueue = () => {
currentlyProcessingQueue = null;
};
}

export function createUpdateQueue<State>(baseState: State): UpdateQueue<State> {
Expand All @@ -163,9 +166,6 @@ export function createUpdateQueue<State>(baseState: State): UpdateQueue<State> {
lastCapturedEffect: null,
hasForceUpdate: false,
};
if (__DEV__) {
queue.isProcessing = false;
}
return queue;
}

Expand All @@ -191,9 +191,6 @@ function cloneUpdateQueue<State>(
firstCapturedEffect: null,
lastCapturedEffect: null,
};
if (__DEV__) {
queue.isProcessing = false;
}
return queue;
}

Expand Down Expand Up @@ -296,7 +293,8 @@ export function enqueueUpdate<State>(
if (__DEV__) {
if (
fiber.tag === ClassComponent &&
(queue1.isProcessing || (queue2 !== null && queue2.isProcessing)) &&
(currentlyProcessingQueue === queue1 ||
(queue2 !== null && currentlyProcessingQueue === queue2)) &&
!didWarnUpdateInsideUpdate
) {
warning(
Expand Down Expand Up @@ -450,7 +448,7 @@ export function processUpdateQueue<State>(
queue = ensureWorkInProgressQueueIsAClone(workInProgress, queue);

if (__DEV__) {
queue.isProcessing = true;
currentlyProcessingQueue = queue;
}

// These values may change as we process the queue.
Expand Down Expand Up @@ -583,7 +581,7 @@ export function processUpdateQueue<State>(
workInProgress.memoizedState = resultState;

if (__DEV__) {
queue.isProcessing = false;
currentlyProcessingQueue = null;
}
}

Expand Down