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: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2366>
This commit is contained in:
Marco Trevisan (Treviño) 2022-07-06 17:50:57 +02:00
parent 74720f250e
commit ad0f11f024

View File

@ -102,11 +102,18 @@ class SignalTracker {
signalData.destroyId = obj.connect_after('destroy', () => this.untrack(obj)); signalData.destroyId = obj.connect_after('destroy', () => this.untrack(obj));
} }
_disconnectSignal(obj, id) { _disconnectSignalForProto(proto, obj, id) {
const proto = obj instanceof GObject.Object proto['disconnect'].call(obj, id);
}
_getObjectProto(obj) {
return obj instanceof GObject.Object
? GObject.Object.prototype ? GObject.Object.prototype
: Object.getPrototypeOf(obj); : 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); const { ownerSignals, destroyId } = this._getSignalData(obj);
this._map.delete(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) if (destroyId)
this._disconnectSignal(obj, destroyId); this._disconnectSignal(obj, destroyId);
} }