From 41dfdba2cfcbae6484d3ea23f96ffc16848ce025 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Wed, 27 May 2026 18:18:13 +0000 Subject: [PATCH] Avoid spread when merging decoration line buckets Replace existing.push(...bucket) with an indexed loop in _mergeLineBucket to avoid intermediate array allocations during buffer trim/insert/delete re-indexing. Reuse _mergeLineBucket in _handleBufferLinesTrim for consistency. Fixes #5941 Co-authored-by: Daniel Imms --- src/common/services/DecorationService.ts | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/common/services/DecorationService.ts b/src/common/services/DecorationService.ts index a582c18af..95875e54a 100644 --- a/src/common/services/DecorationService.ts +++ b/src/common/services/DecorationService.ts @@ -225,12 +225,7 @@ export class DecorationLineCache extends Disposable { if (newLine < 0) { continue; } - const existing = newMap.get(newLine); - if (existing) { - existing.push(...bucket); - } else { - newMap.set(newLine, bucket.slice()); - } + this._mergeLineBucket(newMap, newLine, bucket); } this._decorationsByLine.clear(); for (const [line, bucket] of newMap) { @@ -254,7 +249,9 @@ export class DecorationLineCache extends Disposable { private _mergeLineBucket(newMap: Map, line: number, bucket: IInternalDecoration[]): void { const existing = newMap.get(line); if (existing) { - existing.push(...bucket); + for (let i = 0, len = bucket.length; i < len; i++) { + existing.push(bucket[i]); + } } else { newMap.set(line, bucket.slice()); }