Micro-optimize JSNodeOwner::isReachableFromOpaqueRoots().
authorakling@apple.com <akling@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 1 Mar 2014 01:11:23 +0000 (01:11 +0000)
committerakling@apple.com <akling@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 1 Mar 2014 01:11:23 +0000 (01:11 +0000)
<https://webkit.org/b/129518>

Only do image and audio element specific checks for element nodes.
Time spent in here goes from 0.8% to 0.5% on DYEB.

Reviewed by Benjamin Poulain.

* bindings/js/JSNodeCustom.cpp:
(WebCore::isReachableFromDOM):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@164900 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/bindings/js/JSNodeCustom.cpp

index 82aecdb613a550c6198060b6d448af13d3f56cb5..3cd2ca64de468e1a1b17307ca7bb4ac560a2fa29 100644 (file)
@@ -1,3 +1,16 @@
+2014-02-28  Andreas Kling  <akling@apple.com>
+
+        Micro-optimize JSNodeOwner::isReachableFromOpaqueRoots().
+        <https://webkit.org/b/129518>
+
+        Only do image and audio element specific checks for element nodes.
+        Time spent in here goes from 0.8% to 0.5% on DYEB.
+
+        Reviewed by Benjamin Poulain.
+
+        * bindings/js/JSNodeCustom.cpp:
+        (WebCore::isReachableFromDOM):
+
 2014-02-28  Geoffrey Garen  <ggaren@apple.com>
 
         JSC Assertion failure every time I start Safari (r164846)
 2014-02-28  Geoffrey Garen  <ggaren@apple.com>
 
         JSC Assertion failure every time I start Safari (r164846)
index dc3a8fe3c3cd849ae1b5ee5f2e4285117bc7483d..e9190fbfd64696ce1ffb5919bfff415d936526cc 100644 (file)
@@ -97,21 +97,25 @@ static inline bool isObservable(JSNode* jsNode, Node* node)
 static inline bool isReachableFromDOM(JSNode* jsNode, Node* node, SlotVisitor& visitor)
 {
     if (!node->inDocument()) {
 static inline bool isReachableFromDOM(JSNode* jsNode, Node* node, SlotVisitor& visitor)
 {
     if (!node->inDocument()) {
-        // If a wrapper is the last reference to an image element
-        // that is loading but not in the document, the wrapper is observable
-        // because it is the only thing keeping the image element alive, and if
-        // the element is destroyed, its load event will not fire.
-        // FIXME: The DOM should manage this issue without the help of JavaScript wrappers.
-        if (isHTMLImageElement(node)) {
-            if (toHTMLImageElement(node)->hasPendingActivity())
-                return true;
-        }
-    #if ENABLE(VIDEO)
-        else if (isHTMLAudioElement(node)) {
-            if (!toHTMLAudioElement(node)->paused())
-                return true;
+        if (node->isElementNode()) {
+            auto& element = toElement(*node);
+
+            // If a wrapper is the last reference to an image element
+            // that is loading but not in the document, the wrapper is observable
+            // because it is the only thing keeping the image element alive, and if
+            // the element is destroyed, its load event will not fire.
+            // FIXME: The DOM should manage this issue without the help of JavaScript wrappers.
+            if (isHTMLImageElement(element)) {
+                if (toHTMLImageElement(element).hasPendingActivity())
+                    return true;
+            }
+#if ENABLE(VIDEO)
+            else if (isHTMLAudioElement(element)) {
+                if (!toHTMLAudioElement(element).paused())
+                    return true;
+            }
+#endif
         }
         }
-    #endif
 
         // If a node is firing event listeners, its wrapper is observable because
         // its wrapper is responsible for marking those event listeners.
 
         // If a node is firing event listeners, its wrapper is observable because
         // its wrapper is responsible for marking those event listeners.