Title: [291538] trunk/Source/WebCore
Revision
291538
Author
cdu...@apple.com
Date
2022-03-19 20:29:17 -0700 (Sat, 19 Mar 2022)

Log Message

Optimize EventTarget::visitJSEventListeners()
https://bugs.webkit.org/show_bug.cgi?id=238116

Reviewed by Darin Adler.

This was confirmed by A/B bots to be a 1-1.5% progression on Speedometer on
iMac 20,1 (Intel).

* dom/EventListenerMap.cpp:
(WebCore::EventListenerMap::clear):
(WebCore::EventListenerMap::replace):
(WebCore::EventListenerMap::add):
(WebCore::EventListenerMap::remove):
(WebCore::EventListenerMap::removeFirstEventListenerCreatedFromMarkup):
(WebCore::EventListenerMap::assertNoActiveIterators const): Deleted.
(WebCore::EventListenerMap::EventListenerMap): Deleted.
(WebCore::EventListenerIterator::EventListenerIterator): Deleted.
(WebCore::EventListenerIterator::~EventListenerIterator): Deleted.
(WebCore::EventListenerIterator::nextListener): Deleted.
* dom/EventListenerMap.h:
(WebCore::EventListenerMap::visitJSEventListeners):
(): Deleted.
(WebCore::EventListenerMap::assertNoActiveIterators const): Deleted.
* dom/EventTarget.cpp:
(WebCore::EventTarget::visitJSEventListeners): Deleted.
* dom/EventTarget.h:
(WebCore::EventTarget::visitJSEventListeners):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (291537 => 291538)


--- trunk/Source/WebCore/ChangeLog	2022-03-20 03:18:09 UTC (rev 291537)
+++ trunk/Source/WebCore/ChangeLog	2022-03-20 03:29:17 UTC (rev 291538)
@@ -1,3 +1,33 @@
+2022-03-19  Chris Dumez  <cdu...@apple.com>
+
+        Optimize EventTarget::visitJSEventListeners()
+        https://bugs.webkit.org/show_bug.cgi?id=238116
+
+        Reviewed by Darin Adler.
+
+        This was confirmed by A/B bots to be a 1-1.5% progression on Speedometer on
+        iMac 20,1 (Intel).
+
+        * dom/EventListenerMap.cpp:
+        (WebCore::EventListenerMap::clear):
+        (WebCore::EventListenerMap::replace):
+        (WebCore::EventListenerMap::add):
+        (WebCore::EventListenerMap::remove):
+        (WebCore::EventListenerMap::removeFirstEventListenerCreatedFromMarkup):
+        (WebCore::EventListenerMap::assertNoActiveIterators const): Deleted.
+        (WebCore::EventListenerMap::EventListenerMap): Deleted.
+        (WebCore::EventListenerIterator::EventListenerIterator): Deleted.
+        (WebCore::EventListenerIterator::~EventListenerIterator): Deleted.
+        (WebCore::EventListenerIterator::nextListener): Deleted.
+        * dom/EventListenerMap.h:
+        (WebCore::EventListenerMap::visitJSEventListeners):
+        (): Deleted.
+        (WebCore::EventListenerMap::assertNoActiveIterators const): Deleted.
+        * dom/EventTarget.cpp:
+        (WebCore::EventTarget::visitJSEventListeners): Deleted.
+        * dom/EventTarget.h:
+        (WebCore::EventTarget::visitJSEventListeners):
+
 2022-03-19  Oriol Brufau  <obru...@igalia.com>
 
         [cssom] Implement border-image serialization

Modified: trunk/Source/WebCore/dom/EventListenerMap.cpp (291537 => 291538)


--- trunk/Source/WebCore/dom/EventListenerMap.cpp	2022-03-20 03:18:09 UTC (rev 291537)
+++ trunk/Source/WebCore/dom/EventListenerMap.cpp	2022-03-20 03:29:17 UTC (rev 291538)
@@ -44,17 +44,8 @@
 
 namespace WebCore {
 
-#ifndef NDEBUG
-void EventListenerMap::assertNoActiveIterators() const
-{
-    ASSERT(!m_activeIteratorCount);
-}
-#endif
+EventListenerMap::EventListenerMap() = default;
 
-EventListenerMap::EventListenerMap()
-{
-}
-
 bool EventListenerMap::containsCapturing(const AtomString& eventType) const
 {
     auto* listeners = find(eventType);
@@ -84,8 +75,6 @@
 void EventListenerMap::clear()
 {
     Locker locker { m_lock };
-    
-    assertNoActiveIterators();
 
     for (auto& entry : m_entries) {
         for (auto& listener : entry.second)
@@ -115,8 +104,6 @@
 void EventListenerMap::replace(const AtomString& eventType, EventListener& oldListener, Ref<EventListener>&& newListener, const RegisteredEventListener::Options& options)
 {
     Locker locker { m_lock };
-    
-    assertNoActiveIterators();
 
     auto* listeners = find(eventType);
     ASSERT(listeners);
@@ -130,8 +117,6 @@
 bool EventListenerMap::add(const AtomString& eventType, Ref<EventListener>&& listener, const RegisteredEventListener::Options& options)
 {
     Locker locker { m_lock };
-    
-    assertNoActiveIterators();
 
     if (auto* listeners = find(eventType)) {
         if (findListener(*listeners, listener, options.capture) != notFound)
@@ -158,8 +143,6 @@
 bool EventListenerMap::remove(const AtomString& eventType, EventListener& listener, bool useCapture)
 {
     Locker locker { m_lock };
-    
-    assertNoActiveIterators();
 
     for (unsigned i = 0; i < m_entries.size(); ++i) {
         if (m_entries[i].first == eventType) {
@@ -198,8 +181,6 @@
 void EventListenerMap::removeFirstEventListenerCreatedFromMarkup(const AtomString& eventType)
 {
     Locker locker { m_lock };
-    
-    assertNoActiveIterators();
 
     for (unsigned i = 0; i < m_entries.size(); ++i) {
         if (m_entries[i].first == eventType) {
@@ -227,51 +208,4 @@
         copyListenersNotCreatedFromMarkupToTarget(entry.first, entry.second, target);
 }
 
-EventListenerIterator::EventListenerIterator(EventTarget* target)
-{
-    ASSERT(target);
-    EventTargetData* data = ""
-
-    if (!data)
-        return;
-
-    m_map = &data->eventListenerMap;
-
-#ifndef NDEBUG
-    m_map->m_activeIteratorCount++;
-#endif
-}
-
-EventListenerIterator::EventListenerIterator(EventListenerMap* map)
-{
-    m_map = map;
-
-#ifndef NDEBUG
-    m_map->m_activeIteratorCount++;
-#endif
-}
-
-#ifndef NDEBUG
-EventListenerIterator::~EventListenerIterator()
-{
-    if (m_map)
-        m_map->m_activeIteratorCount--;
-}
-#endif
-
-EventListener* EventListenerIterator::nextListener()
-{
-    if (!m_map)
-        return nullptr;
-
-    for (; m_entryIndex < m_map->m_entries.size(); ++m_entryIndex) {
-        EventListenerVector& listeners = m_map->m_entries[m_entryIndex].second;
-        if (m_index < listeners.size())
-            return &listeners[m_index++]->callback();
-        m_index = 0;
-    }
-
-    return nullptr;
-}
-
 } // namespace WebCore

Modified: trunk/Source/WebCore/dom/EventListenerMap.h (291537 => 291538)


--- trunk/Source/WebCore/dom/EventListenerMap.h	2022-03-20 03:18:09 UTC (rev 291537)
+++ trunk/Source/WebCore/dom/EventListenerMap.h	2022-03-20 03:29:17 UTC (rev 291538)
@@ -66,41 +66,22 @@
     void removeFirstEventListenerCreatedFromMarkup(const AtomString& eventType);
     void copyEventListenersNotCreatedFromMarkupToTarget(EventTarget*);
     
+    template<typename Visitor> void visitJSEventListeners(Visitor&);
     Lock& lock() { return m_lock; }
 
 private:
-    friend class EventListenerIterator;
-
-    void assertNoActiveIterators() const;
-
     Vector<std::pair<AtomString, EventListenerVector>> m_entries;
-
-#ifndef NDEBUG
-    std::atomic<int> m_activeIteratorCount { 0 };
-#endif
-
     Lock m_lock;
 };
 
-class EventListenerIterator {
-    WTF_MAKE_NONCOPYABLE(EventListenerIterator);
-public:
-    explicit EventListenerIterator(EventTarget*);
-    explicit EventListenerIterator(EventListenerMap*);
-#ifndef NDEBUG
-    ~EventListenerIterator();
-#endif
+template<typename Visitor>
+void EventListenerMap::visitJSEventListeners(Visitor& visitor)
+{
+    Locker locker { m_lock };
+    for (auto& entry : m_entries) {
+        for (auto& eventListener : entry.second)
+            eventListener->callback().visitJSFunction(visitor);
+    }
+}
 
-    EventListener* nextListener();
-
-private:
-    EventListenerMap* m_map { nullptr };
-    unsigned m_entryIndex { 0 };
-    unsigned m_index { 0 };
-};
-
-#ifdef NDEBUG
-inline void EventListenerMap::assertNoActiveIterators() const { }
-#endif
-
 } // namespace WebCore

Modified: trunk/Source/WebCore/dom/EventTarget.cpp (291537 => 291538)


--- trunk/Source/WebCore/dom/EventTarget.cpp	2022-03-20 03:18:09 UTC (rev 291537)
+++ trunk/Source/WebCore/dom/EventTarget.cpp	2022-03-20 03:29:17 UTC (rev 291538)
@@ -405,22 +405,6 @@
     threadData.setIsInRemoveAllEventListeners(false);
 }
 
-template<typename Visitor>
-void EventTarget::visitJSEventListeners(Visitor& visitor)
-{
-    EventTargetData* data = ""
-    if (!data)
-        return;
-    
-    Locker locker { data->eventListenerMap.lock() };
-    EventListenerIterator iterator(&data->eventListenerMap);
-    while (auto* listener = iterator.nextListener())
-        listener->visitJSFunction(visitor);
-}
-
-template void EventTarget::visitJSEventListeners(JSC::AbstractSlotVisitor&);
-template void EventTarget::visitJSEventListeners(JSC::SlotVisitor&);
-
 void EventTarget::invalidateEventListenerRegions()
 {
     if (is<Element>(*this)) {

Modified: trunk/Source/WebCore/dom/EventTarget.h (291537 => 291538)


--- trunk/Source/WebCore/dom/EventTarget.h	2022-03-20 03:18:09 UTC (rev 291537)
+++ trunk/Source/WebCore/dom/EventTarget.h	2022-03-20 03:29:17 UTC (rev 291538)
@@ -125,8 +125,6 @@
     
     void innerInvokeEventListeners(Event&, EventListenerVector, EventInvokePhase);
     void invalidateEventListenerRegions();
-
-    friend class EventListenerIterator;
 };
 
 class EventTargetWithInlineData : public EventTarget {
@@ -168,4 +166,11 @@
     return data && data->eventListenerMap.containsCapturing(eventType);
 }
 
+template<typename Visitor>
+void EventTarget::visitJSEventListeners(Visitor& visitor)
+{
+    if (auto* data = ""
+        data->eventListenerMap.visitJSEventListeners(visitor);
+}
+
 } // namespace WebCore
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to