From 19996306ec5ec4ec0f96d7f93c492b7232b8df55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Theys?= Date: Thu, 9 Dec 2021 15:39:50 +0000 Subject: [PATCH] [FIX] mail: move field listener code outside of loop when possible MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Some decently costly operations (especially when repeated many times) where done inside a loop for no reason. task-2702450 closes odoo/odoo#81187 X-original-commit: c6e4ddf531d29ca1693cc6139b81cea3f5b78fdf Signed-off-by: Alexandre Kühn (aku) --- addons/mail/static/src/model/model_manager.js | 38 +++++++++---------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/addons/mail/static/src/model/model_manager.js b/addons/mail/static/src/model/model_manager.js index 9e1a8e2cb0e..c6783d3f045 100644 --- a/addons/mail/static/src/model/model_manager.js +++ b/addons/mail/static/src/model/model_manager.js @@ -1224,30 +1224,30 @@ export class ModelManager { for (const field of Model.__fieldList) { Object.defineProperty(Model.prototype, field.fieldName, { get: function getFieldValue() { // this is bound to record - for (const listener of this.modelManager._listeners) { - listener.lastObservedLocalIds.add(this.localId); + if (this.modelManager._listeners.size) { if (!this.modelManager._listenersObservingLocalId.has(this.localId)) { this.modelManager._listenersObservingLocalId.set(this.localId, new Map()); } const entryLocalId = this.modelManager._listenersObservingLocalId.get(this.localId); - const info = { - listener, - reason: `getField - ${field} of ${this}`, - }; - if (entryLocalId.has(listener)) { - entryLocalId.get(listener).push(info); - } else { - entryLocalId.set(listener, [info]); - } + const reason = `getField - ${field} of ${this}`; const entryField = this.modelManager._listenersObservingFieldOfLocalId.get(this.localId).get(field); - if (!listener.lastObservedFieldsByLocalId.has(this.localId)) { - listener.lastObservedFieldsByLocalId.set(this.localId, new Set()); - } - listener.lastObservedFieldsByLocalId.get(this.localId).add(field); - if (entryField.has(listener)) { - entryField.get(listener).push(info); - } else { - entryField.set(listener, [info]); + for (const listener of this.modelManager._listeners) { + listener.lastObservedLocalIds.add(this.localId); + const info = { listener, reason }; + if (entryLocalId.has(listener)) { + entryLocalId.get(listener).push(info); + } else { + entryLocalId.set(listener, [info]); + } + if (!listener.lastObservedFieldsByLocalId.has(this.localId)) { + listener.lastObservedFieldsByLocalId.set(this.localId, new Set()); + } + listener.lastObservedFieldsByLocalId.get(this.localId).add(field); + if (entryField.has(listener)) { + entryField.get(listener).push(info); + } else { + entryField.set(listener, [info]); + } } } return field.get(this);