45 lines
2.3 KiB
Diff
45 lines
2.3 KiB
Diff
# 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]]);
|
||
}
|