From 41544fb952aef84fcf6ff5d9a5284cf2b2985053 Mon Sep 17 00:00:00 2001 From: Martin Klein <36695017+flitzrrr@users.noreply.github.com> Date: Sun, 11 Oct 2026 12:10:13 +0200 Subject: [PATCH] perf(javascript): skip the repeated-prefix scan on first capture visits (#1789) Review follow-up. Only a capture already on the alias chain can repeat a prefix, so a first visit no longer slices and serializes every suffix of its path. --- .../javascript/javascriptSemanticMemberMutations.ts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/domain/javascript/javascriptSemanticMemberMutations.ts b/src/domain/javascript/javascriptSemanticMemberMutations.ts index 52d4b25dad..62df4c38cb 100644 --- a/src/domain/javascript/javascriptSemanticMemberMutations.ts +++ b/src/domain/javascript/javascriptSemanticMemberMutations.ts @@ -139,8 +139,15 @@ export function* collectSemanticMemberMutationsSteps( // same prefix added on every cycle, so exact paths never repeat. When // that prefix can never be pruned, escaping it once covers every longer // effect, including writes below shared children. + // Only a capture already on this alias chain can repeat a prefix. + const captureKey = JSON.stringify(capture); + const revisited = current.bindings.has(captureKey); let repeatedPrefix: PropertyPath | undefined; - for (let start = 1; start <= current.path.length; start++) { + for ( + let start = 1; + revisited && start <= current.path.length; + start++ + ) { const suffix = current.path.slice(start); if (!current.bindings.has(JSON.stringify([...capture, suffix]))) continue; @@ -240,7 +247,7 @@ export function* collectSemanticMemberMutationsSteps( const primitiveWrite = value?.status === "literal" || value?.status === "union"; recordedEffects.add(identity); - const nested = new Set([...current.bindings, lifetime]); + const nested = new Set([...current.bindings, lifetime, captureKey]); const origins = current.originAt === undefined ? binding