From 76e9ed75e6ae69108d7dbb5e16dd0677857ed085 Mon Sep 17 00:00:00 2001 From: Connor Peet Date: Thu, 22 Jun 2023 11:48:38 -0700 Subject: [PATCH] blackhole listeners for disposed emitters to avoid strange state --- src/vs/base/common/event.ts | 10 ++++++++++ .../userData/test/browser/fileUserDataProvider.test.ts | 4 ++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/vs/base/common/event.ts b/src/vs/base/common/event.ts index d5aac074a3eb5..c4f9b7282593d 100644 --- a/src/vs/base/common/event.ts +++ b/src/vs/base/common/event.ts @@ -848,8 +848,10 @@ class Stacktrace { } } +let id = 0; class UniqueContainer { stack?: Stacktrace; + public id = id++; constructor(public readonly value: T) { } } const compactionThreshold = 2; @@ -977,6 +979,11 @@ export class Emitter { return Disposable.None; } + if (this._disposed) { + // todo: should we warn if a listener is added to a disposed emitter? This happens often + return Disposable.None; + } + if (thisArgs) { callback = callback.bind(thisArgs); } @@ -1040,6 +1047,9 @@ export class Emitter { const index = listeners.indexOf(listener); if (index === -1) { + console.log('disposed?', this._disposed); + console.log('size?', this._size); + console.log('arr?', JSON.stringify(this._listeners)); throw new Error('Attempted to dispose unknown listener'); } diff --git a/src/vs/platform/userData/test/browser/fileUserDataProvider.test.ts b/src/vs/platform/userData/test/browser/fileUserDataProvider.test.ts index b9b05469bde11..be1d5377a39a3 100644 --- a/src/vs/platform/userData/test/browser/fileUserDataProvider.test.ts +++ b/src/vs/platform/userData/test/browser/fileUserDataProvider.test.ts @@ -311,10 +311,10 @@ suite('FileUserDataProvider - Watching', () => { const rootFileResource = joinPath(ROOT, 'User'); const rootUserDataResource = rootFileResource.with({ scheme: Schemas.vscodeUserData }); - const fileEventEmitter: Emitter = new Emitter(); - disposables.add(fileEventEmitter); + let fileEventEmitter: Emitter; setup(() => { + fileEventEmitter = disposables.add(new Emitter()); testObject = disposables.add(new FileUserDataProvider(rootFileResource.scheme, new TestFileSystemProvider(fileEventEmitter.event), Schemas.vscodeUserData, new NullLogService())); });