From 743793b2744b6dfb25a782e6d3f10cdb7c74ecbc Mon Sep 17 00:00:00 2001 From: zombieJ Date: Fri, 20 Oct 2017 11:09:02 +0800 Subject: [PATCH 1/7] move to pendingProps to args --- packages/react-reconciler/src/ReactChildFiber.js | 7 +++---- packages/react-reconciler/src/ReactFiber.js | 3 ++- packages/react-reconciler/src/ReactFiberScheduler.js | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/react-reconciler/src/ReactChildFiber.js b/packages/react-reconciler/src/ReactChildFiber.js index 2aab280dde6..33358ffa4fe 100644 --- a/packages/react-reconciler/src/ReactChildFiber.js +++ b/packages/react-reconciler/src/ReactChildFiber.js @@ -292,7 +292,7 @@ function ChildReconciler(shouldClone, shouldTrackSideEffects) { // We currently set sibling to null and index to 0 here because it is easy // to forget to do before returning it. E.g. for the single child case. if (shouldClone) { - const clone = createWorkInProgress(fiber, expirationTime); + const clone = createWorkInProgress(fiber, expirationTime, null); clone.index = 0; clone.sibling = null; return clone; @@ -1499,9 +1499,8 @@ exports.cloneChildFibers = function( let newChild = createWorkInProgress( currentChild, currentChild.expirationTime, + currentChild.pendingProps, ); - // TODO: Pass this as an argument, since it's easy to forget. - newChild.pendingProps = currentChild.pendingProps; workInProgress.child = newChild; newChild.return = workInProgress; @@ -1510,8 +1509,8 @@ exports.cloneChildFibers = function( newChild = newChild.sibling = createWorkInProgress( currentChild, currentChild.expirationTime, + currentChild.pendingProps, ); - newChild.pendingProps = currentChild.pendingProps; newChild.return = workInProgress; } newChild.sibling = null; diff --git a/packages/react-reconciler/src/ReactFiber.js b/packages/react-reconciler/src/ReactFiber.js index 18e4a984a3f..b6506d29322 100644 --- a/packages/react-reconciler/src/ReactFiber.js +++ b/packages/react-reconciler/src/ReactFiber.js @@ -235,6 +235,7 @@ function shouldConstruct(Component) { exports.createWorkInProgress = function( current: Fiber, expirationTime: ExpirationTime, + pendingProps: any, ): Fiber { let workInProgress = current.alternate; if (workInProgress === null) { @@ -279,7 +280,7 @@ exports.createWorkInProgress = function( workInProgress.updateQueue = current.updateQueue; // pendingProps is set by the parent during reconciliation. - // TODO: Pass this as an argument. + workInProgress.pendingProps = pendingProps; // These will be overridden during the parent's reconciliation workInProgress.sibling = current.sibling; diff --git a/packages/react-reconciler/src/ReactFiberScheduler.js b/packages/react-reconciler/src/ReactFiberScheduler.js index da726ef51ee..697257b8b85 100644 --- a/packages/react-reconciler/src/ReactFiberScheduler.js +++ b/packages/react-reconciler/src/ReactFiberScheduler.js @@ -805,7 +805,7 @@ module.exports = function( resetContextStack(); nextRoot = root; nextRenderExpirationTime = expirationTime; - nextUnitOfWork = createWorkInProgress(nextRoot.current, expirationTime); + nextUnitOfWork = createWorkInProgress(nextRoot.current, expirationTime, null); } let didError = false; From 0b2783a8880889012d36b7b1dac022a1f1576a08 Mon Sep 17 00:00:00 2001 From: zombieJ Date: Fri, 20 Oct 2017 13:04:17 +0800 Subject: [PATCH 2/7] update userFiber in ReactChildFiber --- .../react-reconciler/src/ReactChildFiber.js | 44 +++++++++---------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/packages/react-reconciler/src/ReactChildFiber.js b/packages/react-reconciler/src/ReactChildFiber.js index 33358ffa4fe..d2ad025b011 100644 --- a/packages/react-reconciler/src/ReactChildFiber.js +++ b/packages/react-reconciler/src/ReactChildFiber.js @@ -288,11 +288,15 @@ function ChildReconciler(shouldClone, shouldTrackSideEffects) { return existingChildren; } - function useFiber(fiber: Fiber, expirationTime: ExpirationTime): Fiber { + function useFiber( + fiber: Fiber, + expirationTime: ExpirationTime, + pendingProps: any, + ): Fiber { // We currently set sibling to null and index to 0 here because it is easy // to forget to do before returning it. E.g. for the single child case. if (shouldClone) { - const clone = createWorkInProgress(fiber, expirationTime, null); + const clone = createWorkInProgress(fiber, expirationTime, pendingProps); clone.index = 0; clone.sibling = null; return clone; @@ -304,6 +308,7 @@ function ChildReconciler(shouldClone, shouldTrackSideEffects) { fiber.effectTag = NoEffect; fiber.index = 0; fiber.sibling = null; + fiber.pendingProps = pendingProps; return fiber; } } @@ -362,8 +367,7 @@ function ChildReconciler(shouldClone, shouldTrackSideEffects) { return created; } else { // Update - const existing = useFiber(current, expirationTime); - existing.pendingProps = textContent; + const existing = useFiber(current, expirationTime, textContent); existing.return = returnFiber; return existing; } @@ -387,9 +391,8 @@ function ChildReconciler(shouldClone, shouldTrackSideEffects) { return created; } else { // Move based on index - const existing = useFiber(current, expirationTime); + const existing = useFiber(current, expirationTime, element.props); existing.ref = coerceRef(current, element); - existing.pendingProps = element.props; existing.return = returnFiber; if (__DEV__) { existing._debugSource = element._source; @@ -417,8 +420,7 @@ function ChildReconciler(shouldClone, shouldTrackSideEffects) { return created; } else { // Move based on index - const existing = useFiber(current, expirationTime); - existing.pendingProps = coroutine; + const existing = useFiber(current, expirationTime, coroutine); existing.return = returnFiber; return existing; } @@ -442,7 +444,7 @@ function ChildReconciler(shouldClone, shouldTrackSideEffects) { return created; } else { // Move based on index - const existing = useFiber(current, expirationTime); + const existing = useFiber(current, expirationTime, null); existing.type = yieldNode.value; existing.return = returnFiber; return existing; @@ -471,8 +473,7 @@ function ChildReconciler(shouldClone, shouldTrackSideEffects) { return created; } else { // Update - const existing = useFiber(current, expirationTime); - existing.pendingProps = portal.children || []; + const existing = useFiber(current, expirationTime, portal.children || []); existing.return = returnFiber; return existing; } @@ -495,8 +496,7 @@ function ChildReconciler(shouldClone, shouldTrackSideEffects) { return created; } else { // Update - const existing = useFiber(current, expirationTime); - existing.pendingProps = fragment; + const existing = useFiber(current, expirationTime, fragment); existing.return = returnFiber; return existing; } @@ -1174,8 +1174,7 @@ function ChildReconciler(shouldClone, shouldTrackSideEffects) { // We already have an existing node so let's just update it and delete // the rest. deleteRemainingChildren(returnFiber, currentFirstChild.sibling); - const existing = useFiber(currentFirstChild, expirationTime); - existing.pendingProps = textContent; + const existing = useFiber(currentFirstChild, expirationTime, textContent); existing.return = returnFiber; return existing; } @@ -1205,9 +1204,8 @@ function ChildReconciler(shouldClone, shouldTrackSideEffects) { if (child.key === key) { if (child.type === element.type) { deleteRemainingChildren(returnFiber, child.sibling); - const existing = useFiber(child, expirationTime); + const existing = useFiber(child, expirationTime, element.props); existing.ref = coerceRef(child, element); - existing.pendingProps = element.props; existing.return = returnFiber; if (__DEV__) { existing._debugSource = element._source; @@ -1248,8 +1246,7 @@ function ChildReconciler(shouldClone, shouldTrackSideEffects) { if (child.key === key) { if (child.tag === CoroutineComponent) { deleteRemainingChildren(returnFiber, child.sibling); - const existing = useFiber(child, expirationTime); - existing.pendingProps = coroutine; + const existing = useFiber(child, expirationTime, coroutine); existing.return = returnFiber; return existing; } else { @@ -1282,7 +1279,7 @@ function ChildReconciler(shouldClone, shouldTrackSideEffects) { if (child !== null) { if (child.tag === YieldComponent) { deleteRemainingChildren(returnFiber, child.sibling); - const existing = useFiber(child, expirationTime); + const existing = useFiber(child, expirationTime, null); existing.type = yieldNode.value; existing.return = returnFiber; return existing; @@ -1319,8 +1316,11 @@ function ChildReconciler(shouldClone, shouldTrackSideEffects) { child.stateNode.implementation === portal.implementation ) { deleteRemainingChildren(returnFiber, child.sibling); - const existing = useFiber(child, expirationTime); - existing.pendingProps = portal.children || []; + const existing = useFiber( + child, + expirationTime, + portal.children || [], + ); existing.return = returnFiber; return existing; } else { From bbfffa3952ae842cd5f21f6787c32a2d52260135 Mon Sep 17 00:00:00 2001 From: zombieJ Date: Tue, 24 Oct 2017 18:13:03 +0800 Subject: [PATCH 3/7] prettier it --- packages/react-reconciler/src/ReactFiberScheduler.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/react-reconciler/src/ReactFiberScheduler.js b/packages/react-reconciler/src/ReactFiberScheduler.js index 697257b8b85..e2848ba8f64 100644 --- a/packages/react-reconciler/src/ReactFiberScheduler.js +++ b/packages/react-reconciler/src/ReactFiberScheduler.js @@ -805,7 +805,11 @@ module.exports = function( resetContextStack(); nextRoot = root; nextRenderExpirationTime = expirationTime; - nextUnitOfWork = createWorkInProgress(nextRoot.current, expirationTime, null); + nextUnitOfWork = createWorkInProgress( + nextRoot.current, + expirationTime, + null, + ); } let didError = false; From d5b6cf238d1ce699f5e24f3f2fca8de352ccf27e Mon Sep 17 00:00:00 2001 From: zombieJ Date: Tue, 31 Oct 2017 19:54:21 +0800 Subject: [PATCH 4/7] prettier it --- packages/react-reconciler/src/ReactChildFiber.js | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/packages/react-reconciler/src/ReactChildFiber.js b/packages/react-reconciler/src/ReactChildFiber.js index d50a1cdb6d6..eea92148ab2 100644 --- a/packages/react-reconciler/src/ReactChildFiber.js +++ b/packages/react-reconciler/src/ReactChildFiber.js @@ -304,7 +304,7 @@ function ChildReconciler(shouldClone, shouldTrackSideEffects) { function useFiber( fiber: Fiber, expirationTime: ExpirationTime, - pendingProps: any, + pendingProps: mixed, ): Fiber { // We currently set sibling to null and index to 0 here because it is easy // to forget to do before returning it. E.g. for the single child case. @@ -1259,9 +1259,13 @@ function ChildReconciler(shouldClone, shouldTrackSideEffects) { : child.type === element.type ) { deleteRemainingChildren(returnFiber, child.sibling); - const existing = useFiber(child, expirationTime, element.type === REACT_FRAGMENT_TYPE - ? element.props.children - : element.props); + const existing = useFiber( + child, + expirationTime, + element.type === REACT_FRAGMENT_TYPE + ? element.props.children + : element.props, + ); existing.ref = coerceRef(child, element); existing.return = returnFiber; if (__DEV__) { From 68f26f286dddb7790f97a52496b7a066b82f9fc5 Mon Sep 17 00:00:00 2001 From: zombieJ Date: Tue, 31 Oct 2017 19:59:05 +0800 Subject: [PATCH 5/7] move expirationTime to the last --- packages/react-reconciler/src/ReactChildFiber.js | 6 +++--- packages/react-reconciler/src/ReactFiber.js | 2 +- packages/react-reconciler/src/ReactFiberScheduler.js | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/react-reconciler/src/ReactChildFiber.js b/packages/react-reconciler/src/ReactChildFiber.js index eea92148ab2..a4c5c9df503 100644 --- a/packages/react-reconciler/src/ReactChildFiber.js +++ b/packages/react-reconciler/src/ReactChildFiber.js @@ -309,7 +309,7 @@ function ChildReconciler(shouldClone, shouldTrackSideEffects) { // We currently set sibling to null and index to 0 here because it is easy // to forget to do before returning it. E.g. for the single child case. if (shouldClone) { - const clone = createWorkInProgress(fiber, expirationTime, pendingProps); + const clone = createWorkInProgress(fiber, pendingProps, expirationTime); clone.index = 0; clone.sibling = null; return clone; @@ -1582,8 +1582,8 @@ exports.cloneChildFibers = function( let currentChild = workInProgress.child; let newChild = createWorkInProgress( currentChild, - currentChild.expirationTime, currentChild.pendingProps, + currentChild.expirationTime, ); workInProgress.child = newChild; @@ -1592,8 +1592,8 @@ exports.cloneChildFibers = function( currentChild = currentChild.sibling; newChild = newChild.sibling = createWorkInProgress( currentChild, - currentChild.expirationTime, currentChild.pendingProps, + currentChild.expirationTime, ); newChild.return = workInProgress; } diff --git a/packages/react-reconciler/src/ReactFiber.js b/packages/react-reconciler/src/ReactFiber.js index 8482afbb9de..fcdfd61addc 100644 --- a/packages/react-reconciler/src/ReactFiber.js +++ b/packages/react-reconciler/src/ReactFiber.js @@ -231,8 +231,8 @@ function shouldConstruct(Component) { // This is used to create an alternate fiber to do work on. exports.createWorkInProgress = function( current: Fiber, - expirationTime: ExpirationTime, pendingProps: any, + expirationTime: ExpirationTime, ): Fiber { let workInProgress = current.alternate; if (workInProgress === null) { diff --git a/packages/react-reconciler/src/ReactFiberScheduler.js b/packages/react-reconciler/src/ReactFiberScheduler.js index d1a7359544c..8e012666a86 100644 --- a/packages/react-reconciler/src/ReactFiberScheduler.js +++ b/packages/react-reconciler/src/ReactFiberScheduler.js @@ -798,8 +798,8 @@ module.exports = function( nextRenderExpirationTime = expirationTime; nextUnitOfWork = createWorkInProgress( nextRoot.current, - expirationTime, null, + expirationTime, ); } From b718d23c6c48f23ebfd80169eeabb0185a8db4c8 Mon Sep 17 00:00:00 2001 From: zombieJ Date: Tue, 31 Oct 2017 20:08:33 +0800 Subject: [PATCH 6/7] move expirationTime to the last on userFiber --- .../react-reconciler/src/ReactChildFiber.js | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/packages/react-reconciler/src/ReactChildFiber.js b/packages/react-reconciler/src/ReactChildFiber.js index a4c5c9df503..bb48f1efc19 100644 --- a/packages/react-reconciler/src/ReactChildFiber.js +++ b/packages/react-reconciler/src/ReactChildFiber.js @@ -303,8 +303,8 @@ function ChildReconciler(shouldClone, shouldTrackSideEffects) { function useFiber( fiber: Fiber, - expirationTime: ExpirationTime, pendingProps: mixed, + expirationTime: ExpirationTime, ): Fiber { // We currently set sibling to null and index to 0 here because it is easy // to forget to do before returning it. E.g. for the single child case. @@ -380,7 +380,7 @@ function ChildReconciler(shouldClone, shouldTrackSideEffects) { return created; } else { // Update - const existing = useFiber(current, expirationTime, textContent); + const existing = useFiber(current, textContent, expirationTime); existing.return = returnFiber; return existing; } @@ -394,7 +394,7 @@ function ChildReconciler(shouldClone, shouldTrackSideEffects) { ): Fiber { if (current !== null && current.type === element.type) { // Move based on index - const existing = useFiber(current, expirationTime, element.props); + const existing = useFiber(current, element.props, expirationTime); existing.ref = coerceRef(current, element); existing.return = returnFiber; if (__DEV__) { @@ -433,7 +433,7 @@ function ChildReconciler(shouldClone, shouldTrackSideEffects) { return created; } else { // Move based on index - const existing = useFiber(current, expirationTime, call); + const existing = useFiber(current, call, expirationTime); existing.return = returnFiber; return existing; } @@ -457,7 +457,7 @@ function ChildReconciler(shouldClone, shouldTrackSideEffects) { return created; } else { // Move based on index - const existing = useFiber(current, expirationTime, null); + const existing = useFiber(current, null, expirationTime); existing.type = returnNode.value; existing.return = returnFiber; return existing; @@ -486,7 +486,7 @@ function ChildReconciler(shouldClone, shouldTrackSideEffects) { return created; } else { // Update - const existing = useFiber(current, expirationTime, portal.children || []); + const existing = useFiber(current, portal.children || [], expirationTime); existing.return = returnFiber; return existing; } @@ -511,7 +511,7 @@ function ChildReconciler(shouldClone, shouldTrackSideEffects) { return created; } else { // Update - const existing = useFiber(current, expirationTime, fragment); + const existing = useFiber(current, fragment, expirationTime); existing.return = returnFiber; return existing; } @@ -1225,7 +1225,7 @@ function ChildReconciler(shouldClone, shouldTrackSideEffects) { // We already have an existing node so let's just update it and delete // the rest. deleteRemainingChildren(returnFiber, currentFirstChild.sibling); - const existing = useFiber(currentFirstChild, expirationTime, textContent); + const existing = useFiber(currentFirstChild, textContent, expirationTime); existing.return = returnFiber; return existing; } @@ -1261,10 +1261,10 @@ function ChildReconciler(shouldClone, shouldTrackSideEffects) { deleteRemainingChildren(returnFiber, child.sibling); const existing = useFiber( child, - expirationTime, element.type === REACT_FRAGMENT_TYPE ? element.props.children : element.props, + expirationTime, ); existing.ref = coerceRef(child, element); existing.return = returnFiber; @@ -1318,7 +1318,7 @@ function ChildReconciler(shouldClone, shouldTrackSideEffects) { if (child.key === key) { if (child.tag === CallComponent) { deleteRemainingChildren(returnFiber, child.sibling); - const existing = useFiber(child, expirationTime, call); + const existing = useFiber(child, call, expirationTime); existing.return = returnFiber; return existing; } else { @@ -1351,7 +1351,7 @@ function ChildReconciler(shouldClone, shouldTrackSideEffects) { if (child !== null) { if (child.tag === ReturnComponent) { deleteRemainingChildren(returnFiber, child.sibling); - const existing = useFiber(child, expirationTime, null); + const existing = useFiber(child, null, expirationTime); existing.type = returnNode.value; existing.return = returnFiber; return existing; @@ -1390,8 +1390,8 @@ function ChildReconciler(shouldClone, shouldTrackSideEffects) { deleteRemainingChildren(returnFiber, child.sibling); const existing = useFiber( child, - expirationTime, portal.children || [], + expirationTime, ); existing.return = returnFiber; return existing; From f4389a02498192ebb02d926d5cddb8dddd60c65a Mon Sep 17 00:00:00 2001 From: Dan Abramov Date: Tue, 31 Oct 2017 13:44:14 +0000 Subject: [PATCH 7/7] Move assignment --- packages/react-reconciler/src/ReactFiber.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/packages/react-reconciler/src/ReactFiber.js b/packages/react-reconciler/src/ReactFiber.js index fcdfd61addc..7182dff7091 100644 --- a/packages/react-reconciler/src/ReactFiber.js +++ b/packages/react-reconciler/src/ReactFiber.js @@ -4,7 +4,6 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @flow */ 'use strict'; @@ -270,15 +269,13 @@ exports.createWorkInProgress = function( } workInProgress.expirationTime = expirationTime; + workInProgress.pendingProps = pendingProps; workInProgress.child = current.child; workInProgress.memoizedProps = current.memoizedProps; workInProgress.memoizedState = current.memoizedState; workInProgress.updateQueue = current.updateQueue; - // pendingProps is set by the parent during reconciliation. - workInProgress.pendingProps = pendingProps; - // These will be overridden during the parent's reconciliation workInProgress.sibling = current.sibling; workInProgress.index = current.index;