Skip to content

Commit 29cd076

Browse files
committed
Use externally saved alternate fibers for persistent ID lookups
1 parent 463a273 commit 29cd076

File tree

1 file changed

+20
-29
lines changed

1 file changed

+20
-29
lines changed

packages/react-devtools-shared/src/backend/renderer.js

Lines changed: 20 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1129,31 +1129,32 @@ export function attach(
11291129

11301130
function getReplayFiberID(fiber: Fiber) {
11311131
const id = getReplayPersistentID(fiber);
1132-
if (!fiber.alternate) {
1132+
1133+
let alternateFiber;
1134+
if (fiber.alternate) {
1135+
// There may be an older version of the fiber, already attached
1136+
alternateFiber = fiber.alternate;
1137+
} else if (window.unmountedFiberAlternates?.has(fiber)) {
1138+
// Or, React may have already deleted the older fiber as part of cleanup,
1139+
// but we stashed it away in the `onCommitFiberUnmount` callback before
1140+
// React actually deleted it. Look it up as provided by the eval wrapper.
1141+
alternateFiber = window.unmountedFiberAlternates.get(fiber);
1142+
}
1143+
1144+
if (!alternateFiber) {
11331145
return id;
11341146
}
1135-
const alternateId = getReplayPersistentID(fiber.alternate);
1147+
1148+
// Our IDs are numeric, so older fibers will have a lower ID.
1149+
// Prefer the older fiber's ID if it exists.
1150+
const alternateId = getReplayPersistentID(alternateFiber);
11361151
return Math.min(id, alternateId);
11371152
}
11381153

11391154
// Returns the unique ID for a Fiber or generates and caches a new one if the Fiber hasn't been seen before.
11401155
// Once this method has been called for a Fiber, untrackFiberID() should always be called later to avoid leaking.
11411156
function getOrGenerateFiberID(fiber: Fiber): number {
1142-
let id = null;
1143-
if (fiberToIDMap.has(fiber)) {
1144-
id = fiberToIDMap.get(fiber);
1145-
} else {
1146-
const {alternate} = fiber;
1147-
if (alternate !== null && fiberToIDMap.has(alternate)) {
1148-
id = fiberToIDMap.get(alternate);
1149-
}
1150-
}
1151-
1152-
let didGenerateID = false;
1153-
if (id === null) {
1154-
didGenerateID = true;
1155-
id = getReplayFiberID(fiber);
1156-
}
1157+
const id = getReplayFiberID(fiber);
11571158

11581159
// This refinement is for Flow purposes only.
11591160
const refinedID = ((id: any): number);
@@ -1174,17 +1175,6 @@ export function attach(
11741175
}
11751176
}
11761177

1177-
if (__DEBUG__) {
1178-
if (didGenerateID) {
1179-
debug(
1180-
'getOrGenerateFiberID()',
1181-
fiber,
1182-
fiber.return,
1183-
'Generated a new UID',
1184-
);
1185-
}
1186-
}
1187-
11881178
return refinedID;
11891179
}
11901180

@@ -2021,7 +2011,7 @@ export function attach(
20212011
}
20222012
}
20232013

2024-
const persistentID = getReplayFiberID(fiber);
2014+
const persistentID = getFiberIDUnsafe(fiber);
20252015
const unsafeID = persistentID;
20262016
if (unsafeID === null) {
20272017
// If we've never seen this Fiber, it might be inside of a legacy render Suspense fragment (so the store is not even aware of it).
@@ -4521,6 +4511,7 @@ export function attach(
45214511
getDisplayNameForFiberID,
45224512
getFiberForNative,
45234513
getFiberIDForNative,
4514+
getFiberIDUnsafe,
45244515
getInstanceAndStyle,
45254516
getOrGenerateFiberID,
45264517
getOwnersList,

0 commit comments

Comments
 (0)