refactor(terminal): drop the contrast-cache _seen map

The admission set was a third bounded map inside a patch whose purpose is
capping memory. The color and CSS maps only ever clear together, so either
one already holding the pair proves it was counted.
This commit is contained in:
Neil
2026-09-19 17:54:30 -07:00
parent 90ccd5be0d
commit cd9e43b577
4 changed files with 45 additions and 60 deletions
@@ -1,8 +1,8 @@
diff --git a/src/browser/ColorContrastCache.ts b/src/browser/ColorContrastCache.ts
index fdcd9d133199a6cd6ba9bea9606a02c03ad03b3d..e3ba7de0ed63abc451d0f404b86ab690ff9f7440 100644
index fdcd9d133199a6cd6ba9bea9606a02c03ad03b3d..ae8e06e77ba077aa5a47f0217dedaaaec0962a2f 100644
--- a/src/browser/ColorContrastCache.ts
+++ b/src/browser/ColorContrastCache.ts
@@ -7,11 +7,16 @@ import { IColorContrastCache } from './Types';
@@ -7,11 +7,15 @@ import { IColorContrastCache } from './Types';
import { IColor } from '../common/Types';
import { TwoKeyMap } from '../common/MultiKeyMap';
@@ -11,7 +11,6 @@ index fdcd9d133199a6cd6ba9bea9606a02c03ad03b3d..e3ba7de0ed63abc451d0f404b86ab690
export class ColorContrastCache implements IColorContrastCache {
private _color: TwoKeyMap</* bg */number, /* fg */number, IColor | null> = new TwoKeyMap();
private _css: TwoKeyMap</* bg */number, /* fg */number, string | null> = new TwoKeyMap();
+ private _seen: TwoKeyMap</* bg */number, /* fg */number, boolean> = new TwoKeyMap();
+ private _entryCount = 0;
public setCss(bg: number, fg: number, value: string | null): void {
@@ -19,7 +18,7 @@ index fdcd9d133199a6cd6ba9bea9606a02c03ad03b3d..e3ba7de0ed63abc451d0f404b86ab690
this._css.set(bg, fg, value);
}
@@ -20,6 +25,7 @@ export class ColorContrastCache implements IColorContrastCache {
@@ -20,6 +24,7 @@ export class ColorContrastCache implements IColorContrastCache {
}
public setColor(bg: number, fg: number, value: IColor | null): void {
@@ -27,24 +26,23 @@ index fdcd9d133199a6cd6ba9bea9606a02c03ad03b3d..e3ba7de0ed63abc451d0f404b86ab690
this._color.set(bg, fg, value);
}
@@ -30,5 +36,20 @@ export class ColorContrastCache implements IColorContrastCache {
@@ -30,5 +35,19 @@ export class ColorContrastCache implements IColorContrastCache {
public clear(): void {
this._color.clear();
this._css.clear();
+ this._seen.clear();
+ this._entryCount = 0;
+ }
+
+ private _admitPair(bg: number, fg: number): void {
+ // setColor and setCss both admit, so _seen keeps a pair to one slot.
+ if (this._seen.get(bg, fg) !== undefined) {
+ // Both setters admit, and the two maps only ever clear together, so either one
+ // already holding the pair means it was counted.
+ if (this._color.get(bg, fg) !== undefined || this._css.get(bg, fg) !== undefined) {
+ return;
+ }
+ // Color pairs outlive atlas pages, including cached misses and DOM-rendered colors.
+ if (this._entryCount >= CONTRAST_CACHE_MAX_ENTRIES) {
+ this.clear();
+ }
+ this._seen.set(bg, fg, true);
+ this._entryCount++;
}
}
File diff suppressed because one or more lines are too long
@@ -1,8 +1,8 @@
diff --git a/src/browser/ColorContrastCache.ts b/src/browser/ColorContrastCache.ts
index fdcd9d133199a6cd6ba9bea9606a02c03ad03b3d..e3ba7de0ed63abc451d0f404b86ab690ff9f7440 100644
index fdcd9d133199a6cd6ba9bea9606a02c03ad03b3d..ae8e06e77ba077aa5a47f0217dedaaaec0962a2f 100644
--- a/src/browser/ColorContrastCache.ts
+++ b/src/browser/ColorContrastCache.ts
@@ -7,11 +7,16 @@ import { IColorContrastCache } from './Types';
@@ -7,11 +7,15 @@ import { IColorContrastCache } from './Types';
import { IColor } from '../common/Types';
import { TwoKeyMap } from '../common/MultiKeyMap';
@@ -11,7 +11,6 @@ index fdcd9d133199a6cd6ba9bea9606a02c03ad03b3d..e3ba7de0ed63abc451d0f404b86ab690
export class ColorContrastCache implements IColorContrastCache {
private _color: TwoKeyMap</* bg */number, /* fg */number, IColor | null> = new TwoKeyMap();
private _css: TwoKeyMap</* bg */number, /* fg */number, string | null> = new TwoKeyMap();
+ private _seen: TwoKeyMap</* bg */number, /* fg */number, boolean> = new TwoKeyMap();
+ private _entryCount = 0;
public setCss(bg: number, fg: number, value: string | null): void {
@@ -19,7 +18,7 @@ index fdcd9d133199a6cd6ba9bea9606a02c03ad03b3d..e3ba7de0ed63abc451d0f404b86ab690
this._css.set(bg, fg, value);
}
@@ -20,6 +25,7 @@ export class ColorContrastCache implements IColorContrastCache {
@@ -20,6 +24,7 @@ export class ColorContrastCache implements IColorContrastCache {
}
public setColor(bg: number, fg: number, value: IColor | null): void {
@@ -27,24 +26,23 @@ index fdcd9d133199a6cd6ba9bea9606a02c03ad03b3d..e3ba7de0ed63abc451d0f404b86ab690
this._color.set(bg, fg, value);
}
@@ -30,5 +36,20 @@ export class ColorContrastCache implements IColorContrastCache {
@@ -30,5 +35,19 @@ export class ColorContrastCache implements IColorContrastCache {
public clear(): void {
this._color.clear();
this._css.clear();
+ this._seen.clear();
+ this._entryCount = 0;
+ }
+
+ private _admitPair(bg: number, fg: number): void {
+ // setColor and setCss both admit, so _seen keeps a pair to one slot.
+ if (this._seen.get(bg, fg) !== undefined) {
+ // Both setters admit, and the two maps only ever clear together, so either one
+ // already holding the pair means it was counted.
+ if (this._color.get(bg, fg) !== undefined || this._css.get(bg, fg) !== undefined) {
+ return;
+ }
+ // Color pairs outlive atlas pages, including cached misses and DOM-rendered colors.
+ if (this._entryCount >= CONTRAST_CACHE_MAX_ENTRIES) {
+ this.clear();
+ }
+ this._seen.set(bg, fg, true);
+ this._entryCount++;
}
}
+9 -9
View File
@@ -9,7 +9,7 @@ overrides:
query-string: 9.5.1
patchedDependencies:
'@xterm/xterm@6.1.0-beta.303': 8e3f250e8d66b10cbaefef476ee7519c1cd8ec1c732553657188b2a4a285f1bc
'@xterm/xterm@6.1.0-beta.303': 45b11f5ce9acc8f6e71c5f0184822217c518a5de58793b5f1900227ce29e8405
expo-notifications@55.0.27: ce20843a3daad4185d7e8571788fa323ba4d11984936188790858650a61749c0
react-native-webview@13.16.2: de6761dfa76a5491a23e49f1262566a8831cab26736a336fdffc5d4e7d05ff27
react-native@0.83.10: 44876634a8efbb0f2c3f66cd4332be170ec821d1cbfc0264ac80680983e8513d
@@ -29,13 +29,13 @@ importers:
version: 2.2.0(react-native@0.83.10(patch_hash=44876634a8efbb0f2c3f66cd4332be170ec821d1cbfc0264ac80680983e8513d)(@babel/core@7.29.7)(@react-native/metro-config@0.85.2(@babel/core@7.29.7))(@types/react@19.2.14)(react@19.2.8))
'@xterm/addon-unicode11':
specifier: 0.10.0-beta.300
version: 0.10.0-beta.300(@xterm/xterm@6.1.0-beta.303(patch_hash=8e3f250e8d66b10cbaefef476ee7519c1cd8ec1c732553657188b2a4a285f1bc))
version: 0.10.0-beta.300(@xterm/xterm@6.1.0-beta.303(patch_hash=45b11f5ce9acc8f6e71c5f0184822217c518a5de58793b5f1900227ce29e8405))
'@xterm/addon-webgl':
specifier: 0.20.0-beta.299
version: 0.20.0-beta.299(@xterm/xterm@6.1.0-beta.303(patch_hash=8e3f250e8d66b10cbaefef476ee7519c1cd8ec1c732553657188b2a4a285f1bc))
version: 0.20.0-beta.299(@xterm/xterm@6.1.0-beta.303(patch_hash=45b11f5ce9acc8f6e71c5f0184822217c518a5de58793b5f1900227ce29e8405))
'@xterm/xterm':
specifier: 6.1.0-beta.303
version: 6.1.0-beta.303(patch_hash=8e3f250e8d66b10cbaefef476ee7519c1cd8ec1c732553657188b2a4a285f1bc)
version: 6.1.0-beta.303(patch_hash=45b11f5ce9acc8f6e71c5f0184822217c518a5de58793b5f1900227ce29e8405)
buffer:
specifier: ^6.0.3
version: 6.0.3
@@ -10511,15 +10511,15 @@ snapshots:
'@xmldom/xmldom@0.9.12': {}
'@xterm/addon-unicode11@0.10.0-beta.300(@xterm/xterm@6.1.0-beta.303(patch_hash=8e3f250e8d66b10cbaefef476ee7519c1cd8ec1c732553657188b2a4a285f1bc))':
'@xterm/addon-unicode11@0.10.0-beta.300(@xterm/xterm@6.1.0-beta.303(patch_hash=45b11f5ce9acc8f6e71c5f0184822217c518a5de58793b5f1900227ce29e8405))':
dependencies:
'@xterm/xterm': 6.1.0-beta.303(patch_hash=8e3f250e8d66b10cbaefef476ee7519c1cd8ec1c732553657188b2a4a285f1bc)
'@xterm/xterm': 6.1.0-beta.303(patch_hash=45b11f5ce9acc8f6e71c5f0184822217c518a5de58793b5f1900227ce29e8405)
'@xterm/addon-webgl@0.20.0-beta.299(@xterm/xterm@6.1.0-beta.303(patch_hash=8e3f250e8d66b10cbaefef476ee7519c1cd8ec1c732553657188b2a4a285f1bc))':
'@xterm/addon-webgl@0.20.0-beta.299(@xterm/xterm@6.1.0-beta.303(patch_hash=45b11f5ce9acc8f6e71c5f0184822217c518a5de58793b5f1900227ce29e8405))':
dependencies:
'@xterm/xterm': 6.1.0-beta.303(patch_hash=8e3f250e8d66b10cbaefef476ee7519c1cd8ec1c732553657188b2a4a285f1bc)
'@xterm/xterm': 6.1.0-beta.303(patch_hash=45b11f5ce9acc8f6e71c5f0184822217c518a5de58793b5f1900227ce29e8405)
'@xterm/xterm@6.1.0-beta.303(patch_hash=8e3f250e8d66b10cbaefef476ee7519c1cd8ec1c732553657188b2a4a285f1bc)': {}
'@xterm/xterm@6.1.0-beta.303(patch_hash=45b11f5ce9acc8f6e71c5f0184822217c518a5de58793b5f1900227ce29e8405)': {}
abab@2.0.6: {}