From 08caa1f29f3abf924361d916259ebc22ed466234 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=B7=E5=AE=87?= Date: Thu, 3 Sep 2026 13:15:49 +0800 Subject: [PATCH] =?UTF-8?q?=E9=98=B2=E6=AD=A2=E8=B5=84=E6=BA=90=E6=AF=94?= =?UTF-8?q?=E8=BE=83=E5=BE=AA=E7=8E=AF=E9=80=92=E5=BD=92=E6=BA=A2=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 为 sameResource 增加对象对访问跟踪,遇到循环结构时安全终止递归 --- .../features/ui-editor/useUiEditorState.ts | 22 ++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/apps/ai-game-creator-shell/src/features/ui-editor/useUiEditorState.ts b/apps/ai-game-creator-shell/src/features/ui-editor/useUiEditorState.ts index 6b14446ec..f87b140bf 100644 --- a/apps/ai-game-creator-shell/src/features/ui-editor/useUiEditorState.ts +++ b/apps/ai-game-creator-shell/src/features/ui-editor/useUiEditorState.ts @@ -238,7 +238,11 @@ function cloneState(state: State): State { return structuredClone(state); } -function sameResource(left: T, right: T): boolean { +function sameResource( + left: T, + right: T, + seenPairs = new WeakMap>(), +): boolean { if (Object.is(left, right)) return true; if ( typeof left !== 'object' || @@ -248,10 +252,22 @@ function sameResource(left: T, right: T): boolean { ) { return false; } + const leftObject = left as object; + const rightObject = right as object; + let seenRightObjects = seenPairs.get(leftObject); + if (seenRightObjects?.has(rightObject)) return true; + if (!seenRightObjects) { + seenRightObjects = new WeakSet(); + seenPairs.set(leftObject, seenRightObjects); + } + seenRightObjects.add(rightObject); + if (Array.isArray(left) || Array.isArray(right)) { if (!Array.isArray(left) || !Array.isArray(right)) return false; if (left.length !== right.length) return false; - return left.every((value, index) => sameResource(value, right[index])); + return left.every((value, index) => + sameResource(value, right[index], seenPairs), + ); } const leftRecord = left as Record; const rightRecord = right as Record; @@ -261,7 +277,7 @@ function sameResource(left: T, right: T): boolean { return leftKeys.every( (key) => Object.prototype.hasOwnProperty.call(rightRecord, key) && - sameResource(leftRecord[key], rightRecord[key]), + sameResource(leftRecord[key], rightRecord[key], seenPairs), ); }