Title: [291495] trunk/Source/WebCore
Revision
291495
Author
cdu...@apple.com
Date
2022-03-18 13:09:08 -0700 (Fri, 18 Mar 2022)

Log Message

Avoid extra pointer dereference in EventListenerMap::m_entries
https://bugs.webkit.org/show_bug.cgi?id=238075

Reviewed by Geoffrey Garen.

This is a confirmed 0.5-0.8% progression on Speedometer according to A/B
bots.

* dom/EventListenerMap.cpp:
(WebCore::EventListenerMap::clear):
(WebCore::EventListenerMap::add):
(WebCore::EventListenerMap::remove):
(WebCore::EventListenerMap::find):
(WebCore::EventListenerMap::removeFirstEventListenerCreatedFromMarkup):
(WebCore::EventListenerMap::copyEventListenersNotCreatedFromMarkupToTarget):
(WebCore::EventListenerIterator::nextListener):
(WebCore::EventListenerMap::find const): Deleted.
* dom/EventListenerMap.h:
(WebCore::EventListenerMap::find const):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (291494 => 291495)


--- trunk/Source/WebCore/ChangeLog	2022-03-18 19:42:42 UTC (rev 291494)
+++ trunk/Source/WebCore/ChangeLog	2022-03-18 20:09:08 UTC (rev 291495)
@@ -1,3 +1,25 @@
+2022-03-18  Chris Dumez  <cdu...@apple.com>
+
+        Avoid extra pointer dereference in EventListenerMap::m_entries
+        https://bugs.webkit.org/show_bug.cgi?id=238075
+
+        Reviewed by Geoffrey Garen.
+
+        This is a confirmed 0.5-0.8% progression on Speedometer according to A/B
+        bots.
+
+        * dom/EventListenerMap.cpp:
+        (WebCore::EventListenerMap::clear):
+        (WebCore::EventListenerMap::add):
+        (WebCore::EventListenerMap::remove):
+        (WebCore::EventListenerMap::find):
+        (WebCore::EventListenerMap::removeFirstEventListenerCreatedFromMarkup):
+        (WebCore::EventListenerMap::copyEventListenersNotCreatedFromMarkupToTarget):
+        (WebCore::EventListenerIterator::nextListener):
+        (WebCore::EventListenerMap::find const): Deleted.
+        * dom/EventListenerMap.h:
+        (WebCore::EventListenerMap::find const):
+
 2022-03-18  Alex Christensen  <achristen...@webkit.org>
 
         Keep a strong reference to session in [WebCoreNSURLSessionDataTask _restart]

Modified: trunk/Source/WebCore/dom/EventListenerMap.cpp (291494 => 291495)


--- trunk/Source/WebCore/dom/EventListenerMap.cpp	2022-03-18 19:42:42 UTC (rev 291494)
+++ trunk/Source/WebCore/dom/EventListenerMap.cpp	2022-03-18 20:09:08 UTC (rev 291495)
@@ -88,7 +88,7 @@
     assertNoActiveIterators();
 
     for (auto& entry : m_entries) {
-        for (auto& listener : *entry.second)
+        for (auto& listener : entry.second)
             listener->markAsRemoved();
     }
 
@@ -140,9 +140,7 @@
         return true;
     }
 
-    auto listeners = makeUnique<EventListenerVector>();
-    listeners->uncheckedAppend(RegisteredEventListener::create(WTFMove(listener), options));
-    m_entries.append({ eventType, WTFMove(listeners) });
+    m_entries.append({ eventType, EventListenerVector { RegisteredEventListener::create(WTFMove(listener), options) } });
     return true;
 }
 
@@ -165,8 +163,8 @@
 
     for (unsigned i = 0; i < m_entries.size(); ++i) {
         if (m_entries[i].first == eventType) {
-            bool wasRemoved = removeListenerFromVector(*m_entries[i].second, listener, useCapture);
-            if (m_entries[i].second->isEmpty())
+            bool wasRemoved = removeListenerFromVector(m_entries[i].second, listener, useCapture);
+            if (m_entries[i].second.isEmpty())
                 m_entries.remove(i);
             return wasRemoved;
         }
@@ -175,11 +173,11 @@
     return false;
 }
 
-EventListenerVector* EventListenerMap::find(const AtomString& eventType) const
+EventListenerVector* EventListenerMap::find(const AtomString& eventType)
 {
     for (auto& entry : m_entries) {
         if (entry.first == eventType)
-            return entry.second.get();
+            return &entry.second;
     }
 
     return nullptr;
@@ -205,8 +203,8 @@
 
     for (unsigned i = 0; i < m_entries.size(); ++i) {
         if (m_entries[i].first == eventType) {
-            removeFirstListenerCreatedFromMarkup(*m_entries[i].second);
-            if (m_entries[i].second->isEmpty())
+            removeFirstListenerCreatedFromMarkup(m_entries[i].second);
+            if (m_entries[i].second.isEmpty())
                 m_entries.remove(i);
             return;
         }
@@ -226,7 +224,7 @@
 void EventListenerMap::copyEventListenersNotCreatedFromMarkupToTarget(EventTarget* target)
 {
     for (auto& entry : m_entries)
-        copyListenersNotCreatedFromMarkupToTarget(entry.first, *entry.second, target);
+        copyListenersNotCreatedFromMarkupToTarget(entry.first, entry.second, target);
 }
 
 EventListenerIterator::EventListenerIterator(EventTarget* target)
@@ -267,7 +265,7 @@
         return nullptr;
 
     for (; m_entryIndex < m_map->m_entries.size(); ++m_entryIndex) {
-        EventListenerVector& listeners = *m_map->m_entries[m_entryIndex].second;
+        EventListenerVector& listeners = m_map->m_entries[m_entryIndex].second;
         if (m_index < listeners.size())
             return &listeners[m_index++]->callback();
         m_index = 0;

Modified: trunk/Source/WebCore/dom/EventListenerMap.h (291494 => 291495)


--- trunk/Source/WebCore/dom/EventListenerMap.h	2022-03-18 19:42:42 UTC (rev 291494)
+++ trunk/Source/WebCore/dom/EventListenerMap.h	2022-03-18 20:09:08 UTC (rev 291495)
@@ -59,7 +59,8 @@
     void replace(const AtomString& eventType, EventListener& oldListener, Ref<EventListener>&& newListener, const RegisteredEventListener::Options&);
     bool add(const AtomString& eventType, Ref<EventListener>&&, const RegisteredEventListener::Options&);
     bool remove(const AtomString& eventType, EventListener&, bool useCapture);
-    WEBCORE_EXPORT EventListenerVector* find(const AtomString& eventType) const;
+    WEBCORE_EXPORT EventListenerVector* find(const AtomString& eventType);
+    const EventListenerVector* find(const AtomString& eventType) const { return const_cast<EventListenerMap*>(this)->find(eventType); }
     Vector<AtomString> eventTypes() const;
 
     void removeFirstEventListenerCreatedFromMarkup(const AtomString& eventType);
@@ -72,7 +73,7 @@
 
     void assertNoActiveIterators() const;
 
-    Vector<std::pair<AtomString, std::unique_ptr<EventListenerVector>>, 2> m_entries;
+    Vector<std::pair<AtomString, EventListenerVector>> m_entries;
 
 #ifndef NDEBUG
     std::atomic<int> m_activeIteratorCount { 0 };
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to