# UNDF: UNDF-2026-000000810 # UNDF: (leave blank) # vscode-0004: configurationModels override identifiers O(N×M) array includes # # File: src/vs/platform/configuration/common/configurationModels.ts # Function: compare (line ~1248) # # Defect: Override identifiers are arrays; set-difference computed with # filter + includes — O(N×M) where N, M = number of override # identifiers (language-specific settings like [typescript], [python]). # Plus line 1267: inner loop also uses toOverrideIdentifiers.includes(). # Fix: Convert to Sets for O(1) lookup. # Severity: LOW-MEDIUM (N = language overrides, typically 5-30) # Speedup: 30x at N=30 # --- a/src/vs/platform/configuration/common/configurationModels.ts +++ b/src/vs/platform/configuration/common/configurationModels.ts @@ -1248,17 +1248,19 @@ const fromOverrideIdentifiers = from?.getAllOverrideIdentifiers() || []; const toOverrideIdentifiers = to?.getAllOverrideIdentifiers() || []; + const fromOverrideSet = new Set(fromOverrideIdentifiers); + const toOverrideSet = new Set(toOverrideIdentifiers); if (to) { - const addedOverrideIdentifiers = toOverrideIdentifiers.filter(key => !fromOverrideIdentifiers.includes(key)); + const addedOverrideIdentifiers = toOverrideIdentifiers.filter(key => !fromOverrideSet.has(key)); for (const identifier of addedOverrideIdentifiers) { overrides.push([identifier, to.getKeysForOverrideIdentifier(identifier)]); } } if (from) { - const removedOverrideIdentifiers = fromOverrideIdentifiers.filter(key => !toOverrideIdentifiers.includes(key)); + const removedOverrideIdentifiers = fromOverrideIdentifiers.filter(key => !toOverrideSet.has(key)); for (const identifier of removedOverrideIdentifiers) { overrides.push([identifier, from.getKeysForOverrideIdentifier(identifier)]); } @@ -1265,7 +1267,7 @@ if (to && from) { for (const identifier of fromOverrideIdentifiers) { - if (toOverrideIdentifiers.includes(identifier)) { + if (toOverrideSet.has(identifier)) { const result = compareConfigurationContents({ contents: from.getOverrideValue(undefined, identifier) || {}, keys: from.getKeysForOverrideIdentifier(identifier) }, { contents: to.getOverrideValue(undefined, identifier) || {}, keys: to.getKeysForOverrideIdentifier(identifier) }); overrides.push([identifier, [...result.added, ...result.removed, ...result.updated]]); }