Extracted from https://github.com/facebook/react/issues/12643.

We're currently diff a host node in the complete phase even if it has bailed out in the begin phase. By itself, this just means we're doing a little bit more work than necessary. But it also has some observable effects. In particular, https://github.com/facebook/react/issues/13424 (which by itself would be very rare and probably not worth fixing) is made worse because we end up committing update to inputs from another component.

I have a fix for this in https://github.com/facebook/react/pull/13423. Filing this for posterity.
},
    advanceTime(ms: number): void {
      elapsedTimeInMs += ms;
    },
    flushExpired(): Array<mixed> {
      return ReactNoop.flushUnitsOfWork(0);
    },
    yield(value: mixed) {
      if (yieldedValues === null) {
        yieldedValues = [value];
      } else {
        yieldedValues.push(value);
      }
    },
    clearYields() {
      const values = yieldedValues;
      yieldedValues = null;
      return values;
    },
    hasScheduledCallback() {
      return !!scheduledCallback;
    },
    batchedUpdates: NoopRenderer.batchedUpdates,
    deferredUpdates: NoopRenderer.deferredUpdates,
    unbatchedUpdates: NoopRenderer.unbatchedUpdates,
    interactiveUpdates: NoopRenderer.interactiveUpdates,
    flushSync(fn: () => mixed) {
      yieldedValues = [];
      NoopRenderer.flushSync(fn);
      return yieldedValues;