From 73a8a66e96d53d896654254dce7891cd3f80787a Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Thu, 6 Oct 2022 18:24:30 -0700 Subject: [PATCH 1/2] Skip dispose if there's nothing to dispose of --- src/vs/base/common/lifecycle.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/vs/base/common/lifecycle.ts b/src/vs/base/common/lifecycle.ts index da910eb4e77ec..f6f89be9d78e8 100644 --- a/src/vs/base/common/lifecycle.ts +++ b/src/vs/base/common/lifecycle.ts @@ -177,7 +177,7 @@ export class DisposableStore implements IDisposable { static DISABLE_DISPOSED_WARNING = false; - private _toDispose = new Set(); + private readonly _toDispose = new Set(); private _isDisposed = false; constructor() { @@ -210,6 +210,10 @@ export class DisposableStore implements IDisposable { * Dispose of all registered disposables but do not mark this object as disposed. */ public clear(): void { + if (this._toDispose.size === 0) { + return; + } + try { dispose(this._toDispose.values()); } finally { From db8bbbc19beee4777ca3cba86ea9094790811236 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Thu, 6 Oct 2022 18:31:00 -0700 Subject: [PATCH 2/2] Dispose should take an Iterable, not an IterableIterator We can use `for of` on any iterable, not just on iterable iterators --- src/vs/base/common/iterator.ts | 2 +- src/vs/base/common/lifecycle.ts | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/vs/base/common/iterator.ts b/src/vs/base/common/iterator.ts index 2771802f1de77..7d6e1da0c0d23 100644 --- a/src/vs/base/common/iterator.ts +++ b/src/vs/base/common/iterator.ts @@ -5,7 +5,7 @@ export namespace Iterable { - export function is(thing: any): thing is IterableIterator { + export function is(thing: any): thing is Iterable { return thing && typeof thing === 'object' && typeof thing[Symbol.iterator] === 'function'; } diff --git a/src/vs/base/common/lifecycle.ts b/src/vs/base/common/lifecycle.ts index f6f89be9d78e8..e36513cfbfc93 100644 --- a/src/vs/base/common/lifecycle.ts +++ b/src/vs/base/common/lifecycle.ts @@ -118,10 +118,10 @@ export function isDisposable(thing: E): thing is E & IDisposab export function dispose(disposable: T): T; export function dispose(disposable: T | undefined): T | undefined; -export function dispose = IterableIterator>(disposables: IterableIterator): A; +export function dispose = Iterable>(disposables: A): A; export function dispose(disposables: Array): Array; export function dispose(disposables: ReadonlyArray): ReadonlyArray; -export function dispose(arg: T | IterableIterator | undefined): any { +export function dispose(arg: T | Iterable | undefined): any { if (Iterable.is(arg)) { const errors: any[] = []; @@ -215,7 +215,7 @@ export class DisposableStore implements IDisposable { } try { - dispose(this._toDispose.values()); + dispose(this._toDispose); } finally { this._toDispose.clear(); }