From ad0f11f02482c28868bcd5dbe0fa67f4f3ad8ca4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Wed, 6 Jul 2022 17:50:57 +0200 Subject: [PATCH] signalTracker: Avoid getting the same owner object proto multiple times While untracking an object we used to compute it's proto for each signal we were disconnecting from, while this is not needed when we're just iterating over all the same owner signals, so let's add few more functions to compute an object prototype, and repeat the disconnections in the simplest way we can. Part-of: --- js/misc/signalTracker.js | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/js/misc/signalTracker.js b/js/misc/signalTracker.js index e01bec5b1..9f8a9a70f 100644 --- a/js/misc/signalTracker.js +++ b/js/misc/signalTracker.js @@ -102,11 +102,18 @@ class SignalTracker { signalData.destroyId = obj.connect_after('destroy', () => this.untrack(obj)); } - _disconnectSignal(obj, id) { - const proto = obj instanceof GObject.Object + _disconnectSignalForProto(proto, obj, id) { + proto['disconnect'].call(obj, id); + } + + _getObjectProto(obj) { + return obj instanceof GObject.Object ? GObject.Object.prototype : Object.getPrototypeOf(obj); - proto['disconnect'].call(obj, id); + } + + _disconnectSignal(obj, id) { + this._disconnectSignalForProto(this._getObjectProto(obj), obj, id); } /** @@ -129,7 +136,9 @@ class SignalTracker { const { ownerSignals, destroyId } = this._getSignalData(obj); this._map.delete(obj); - ownerSignals.forEach(id => this._disconnectSignal(this._owner, id)); + const ownerProto = this._getObjectProto(this._owner); + ownerSignals.forEach(id => + this._disconnectSignalForProto(ownerProto, this._owner, id)); if (destroyId) this._disconnectSignal(obj, destroyId); }