Clear fiber.sibling field when clearing nextEffect (#18970)
* Clear fiber.sibling field when clearing nextEffect
This commit is contained in:
parent
c93a6cb4d5
commit
730ae7afa2
|
@ -1124,7 +1124,7 @@ function commitNestedUnmounts(
|
|||
}
|
||||
}
|
||||
|
||||
function detachFiber(fiber: Fiber) {
|
||||
function detachFiberMutation(fiber: Fiber) {
|
||||
// Cut off the return pointers to disconnect it from the tree. Ideally, we
|
||||
// should clear the child pointer of the parent alternate to let this
|
||||
// get GC:ed but we don't know which for sure which parent is the current
|
||||
|
@ -1132,7 +1132,8 @@ function detachFiber(fiber: Fiber) {
|
|||
// itself will be GC:ed when the parent updates the next time.
|
||||
// Note: we cannot null out sibling here, otherwise it can cause issues
|
||||
// with findDOMNode and how it requires the sibling field to carry out
|
||||
// traversal in a later effect. See PR #16820.
|
||||
// traversal in a later effect. See PR #16820. We now clear the sibling
|
||||
// field after effects, see: detachFiberAfterEffects.
|
||||
fiber.alternate = null;
|
||||
fiber.child = null;
|
||||
fiber.dependencies_new = null;
|
||||
|
@ -1543,9 +1544,9 @@ function commitDeletion(
|
|||
commitNestedUnmounts(finishedRoot, current, renderPriorityLevel);
|
||||
}
|
||||
const alternate = current.alternate;
|
||||
detachFiber(current);
|
||||
detachFiberMutation(current);
|
||||
if (alternate !== null) {
|
||||
detachFiber(alternate);
|
||||
detachFiberMutation(alternate);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1122,7 +1122,7 @@ function commitNestedUnmounts(
|
|||
}
|
||||
}
|
||||
|
||||
function detachFiber(fiber: Fiber) {
|
||||
function detachFiberMutation(fiber: Fiber) {
|
||||
// Cut off the return pointers to disconnect it from the tree. Ideally, we
|
||||
// should clear the child pointer of the parent alternate to let this
|
||||
// get GC:ed but we don't know which for sure which parent is the current
|
||||
|
@ -1130,7 +1130,8 @@ function detachFiber(fiber: Fiber) {
|
|||
// itself will be GC:ed when the parent updates the next time.
|
||||
// Note: we cannot null out sibling here, otherwise it can cause issues
|
||||
// with findDOMNode and how it requires the sibling field to carry out
|
||||
// traversal in a later effect. See PR #16820.
|
||||
// traversal in a later effect. See PR #16820. We now clear the sibling
|
||||
// field after effects, see: detachFiberAfterEffects.
|
||||
fiber.alternate = null;
|
||||
fiber.child = null;
|
||||
fiber.dependencies_old = null;
|
||||
|
@ -1541,9 +1542,9 @@ function commitDeletion(
|
|||
commitNestedUnmounts(finishedRoot, current, renderPriorityLevel);
|
||||
}
|
||||
const alternate = current.alternate;
|
||||
detachFiber(current);
|
||||
detachFiberMutation(current);
|
||||
if (alternate !== null) {
|
||||
detachFiber(alternate);
|
||||
detachFiberMutation(alternate);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1993,6 +1993,9 @@ function commitRootImpl(root, renderPriorityLevel) {
|
|||
while (nextEffect !== null) {
|
||||
const nextNextEffect = nextEffect.nextEffect;
|
||||
nextEffect.nextEffect = null;
|
||||
if (nextEffect.effectTag & Deletion) {
|
||||
detachFiberAfterEffects(nextEffect);
|
||||
}
|
||||
nextEffect = nextNextEffect;
|
||||
}
|
||||
}
|
||||
|
@ -2447,6 +2450,9 @@ function flushPassiveEffectsImpl() {
|
|||
const nextNextEffect = effect.nextEffect;
|
||||
// Remove nextEffect pointer to assist GC
|
||||
effect.nextEffect = null;
|
||||
if (effect.effectTag & Deletion) {
|
||||
detachFiberAfterEffects(effect);
|
||||
}
|
||||
effect = nextNextEffect;
|
||||
}
|
||||
|
||||
|
@ -3549,3 +3555,7 @@ export function act(callback: () => Thenable<mixed>): Thenable<void> {
|
|||
};
|
||||
}
|
||||
}
|
||||
|
||||
function detachFiberAfterEffects(fiber: Fiber): void {
|
||||
fiber.sibling = null;
|
||||
}
|
||||
|
|
|
@ -2101,6 +2101,9 @@ function commitRootImpl(root, renderPriorityLevel) {
|
|||
while (nextEffect !== null) {
|
||||
const nextNextEffect = nextEffect.nextEffect;
|
||||
nextEffect.nextEffect = null;
|
||||
if (nextEffect.effectTag & Deletion) {
|
||||
detachFiberAfterEffects(nextEffect);
|
||||
}
|
||||
nextEffect = nextNextEffect;
|
||||
}
|
||||
}
|
||||
|
@ -2595,6 +2598,9 @@ function flushPassiveEffectsImpl() {
|
|||
const nextNextEffect = effect.nextEffect;
|
||||
// Remove nextEffect pointer to assist GC
|
||||
effect.nextEffect = null;
|
||||
if (effect.effectTag & Deletion) {
|
||||
detachFiberAfterEffects(effect);
|
||||
}
|
||||
effect = nextNextEffect;
|
||||
}
|
||||
|
||||
|
@ -3712,3 +3718,7 @@ export function act(callback: () => Thenable<mixed>): Thenable<void> {
|
|||
};
|
||||
}
|
||||
}
|
||||
|
||||
function detachFiberAfterEffects(fiber: Fiber): void {
|
||||
fiber.sibling = null;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue