Title: [132464] trunk/Source/WebCore
Revision
132464
Author
[email protected]
Date
2012-10-25 02:47:48 -0700 (Thu, 25 Oct 2012)

Log Message

[V8] We can handle ActiveDOMNodes and DOMNodes in the same GC visitor
https://bugs.webkit.org/show_bug.cgi?id=100351

Reviewed by Eric Seidel.

There is no reason to handle active DOM nodes in a separate pass from
regular DOM nodes anymore.

* bindings/v8/V8DOMMap.cpp:
* bindings/v8/V8DOMMap.h:
(WebCore):
* bindings/v8/V8GCController.cpp:
(WebCore::ActiveDOMObjectPrologueVisitor::visitDOMWrapper):
(WebCore::NodeVisitor::NodeVisitor):
(NodeVisitor):
(WebCore::NodeVisitor::visitNodeWrapper):
(WebCore::V8GCController::majorGCPrologue):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (132463 => 132464)


--- trunk/Source/WebCore/ChangeLog	2012-10-25 09:32:40 UTC (rev 132463)
+++ trunk/Source/WebCore/ChangeLog	2012-10-25 09:47:48 UTC (rev 132464)
@@ -1,3 +1,23 @@
+2012-10-25  Adam Barth  <[email protected]>
+
+        [V8] We can handle ActiveDOMNodes and DOMNodes in the same GC visitor
+        https://bugs.webkit.org/show_bug.cgi?id=100351
+
+        Reviewed by Eric Seidel.
+
+        There is no reason to handle active DOM nodes in a separate pass from
+        regular DOM nodes anymore.
+
+        * bindings/v8/V8DOMMap.cpp:
+        * bindings/v8/V8DOMMap.h:
+        (WebCore):
+        * bindings/v8/V8GCController.cpp:
+        (WebCore::ActiveDOMObjectPrologueVisitor::visitDOMWrapper):
+        (WebCore::NodeVisitor::NodeVisitor):
+        (NodeVisitor):
+        (WebCore::NodeVisitor::visitNodeWrapper):
+        (WebCore::V8GCController::majorGCPrologue):
+
 2012-10-25  Alexander Pavlov  <[email protected]>
 
         Web Inspector: Improper out-of-order call on a rule that is being removed from the stylesheet.

Modified: trunk/Source/WebCore/bindings/v8/V8DOMMap.cpp (132463 => 132464)


--- trunk/Source/WebCore/bindings/v8/V8DOMMap.cpp	2012-10-25 09:32:40 UTC (rev 132463)
+++ trunk/Source/WebCore/bindings/v8/V8DOMMap.cpp	2012-10-25 09:47:48 UTC (rev 132464)
@@ -99,18 +99,6 @@
     v8::V8::VisitHandlesWithClassIds(&visitorAdapter);
 }
 
-void visitActiveDOMNodes(DOMWrapperVisitor<Node>* visitor)
-{
-    v8::HandleScope scope;
-
-    Vector<DOMDataStore*>& list = V8PerIsolateData::current()->allStores();
-    for (size_t i = 0; i < list.size(); ++i) {
-        DOMDataStore* store = list[i];
-
-        store->activeDomNodeMap().visit(store, visitor);
-    }
-}
-
 void visitDOMObjects(DOMWrapperVisitor<void>* visitor)
 {
     v8::HandleScope scope;

Modified: trunk/Source/WebCore/bindings/v8/V8DOMMap.h (132463 => 132464)


--- trunk/Source/WebCore/bindings/v8/V8DOMMap.h	2012-10-25 09:32:40 UTC (rev 132463)
+++ trunk/Source/WebCore/bindings/v8/V8DOMMap.h	2012-10-25 09:47:48 UTC (rev 132464)
@@ -44,7 +44,6 @@
 
     DOMWrapperMap<Node>& getDOMNodeMap(v8::Isolate* = 0);
     DOMWrapperMap<Node>& getActiveDOMNodeMap(v8::Isolate* = 0);
-    void visitActiveDOMNodes(DOMWrapperVisitor<Node>*);
 
     class NodeWrapperVisitor {
     public:

Modified: trunk/Source/WebCore/bindings/v8/V8GCController.cpp (132463 => 132464)


--- trunk/Source/WebCore/bindings/v8/V8GCController.cpp	2012-10-25 09:32:40 UTC (rev 132463)
+++ trunk/Source/WebCore/bindings/v8/V8GCController.cpp	2012-10-25 09:47:48 UTC (rev 132464)
@@ -67,29 +67,28 @@
 
 namespace WebCore {
 
-template<typename T>
-class ActiveDOMObjectPrologueVisitor : public DOMWrapperVisitor<T> {
+class ActiveDOMObjectPrologueVisitor : public DOMWrapperVisitor<void> {
 public:
     explicit ActiveDOMObjectPrologueVisitor(Vector<v8::Persistent<v8::Value> >* liveObjects)
         : m_liveObjects(liveObjects)
     {
     }
 
-    void visitDOMWrapper(DOMDataStore*, T* object, v8::Persistent<v8::Object> wrapper)
+    void visitDOMWrapper(DOMDataStore*, void* object, v8::Persistent<v8::Object> wrapper)
     {
-        WrapperTypeInfo* typeInfo = V8DOMWrapper::domWrapperType(wrapper);  
+        WrapperTypeInfo* type = V8DOMWrapper::domWrapperType(wrapper);  
 
-        if (V8MessagePort::info.equals(typeInfo)) {
+        if (V8MessagePort::info.equals(type)) {
             // Mark each port as in-use if it's entangled. For simplicity's sake,
             // we assume all ports are remotely entangled, since the Chromium port
             // implementation can't tell the difference.
-            MessagePort* port = reinterpret_cast<MessagePort*>(object);
+            MessagePort* port = static_cast<MessagePort*>(object);
             if (port->isEntangled() || port->hasPendingActivity())
                 m_liveObjects->append(wrapper);
             return;
         }
 
-        ActiveDOMObject* activeDOMObject = typeInfo->toActiveDOMObject(wrapper);
+        ActiveDOMObject* activeDOMObject = type->toActiveDOMObject(wrapper);
         if (activeDOMObject && activeDOMObject->hasPendingActivity())
             m_liveObjects->append(wrapper);
     }
@@ -168,11 +167,22 @@
 
 class NodeVisitor : public NodeWrapperVisitor {
 public:
+    explicit NodeVisitor(Vector<v8::Persistent<v8::Value> >* liveObjects)
+        : m_liveObjects(liveObjects)
+    {
+    }
+
     void visitNodeWrapper(Node* node, v8::Persistent<v8::Object> wrapper)
     {
         if (node->hasEventListeners())
             addImplicitReferencesForNodeWithEventListeners(node, wrapper);
 
+        WrapperTypeInfo* type = V8DOMWrapper::domWrapperType(wrapper);  
+
+        ActiveDOMObject* activeDOMObject = type->toActiveDOMObject(wrapper);
+        if (activeDOMObject && activeDOMObject->hasPendingActivity())
+            m_liveObjects->append(wrapper);
+
         Node* root = rootForGC(node);
         if (!root)
             return;
@@ -199,6 +209,7 @@
     }
 
 private:
+    Vector<v8::Persistent<v8::Value> >* m_liveObjects;
     Vector<ImplicitConnection> m_connections;
 };
 
@@ -222,16 +233,16 @@
 
     Vector<v8::Persistent<v8::Value> > liveObjects;
     liveObjects.append(V8PerIsolateData::current()->ensureLiveRoot());
-    ActiveDOMObjectPrologueVisitor<void> activeObjectVisitor(&liveObjects);
+
+    ActiveDOMObjectPrologueVisitor activeObjectVisitor(&liveObjects);
     visitActiveDOMObjects(&activeObjectVisitor);
-    ActiveDOMObjectPrologueVisitor<Node> activeNodeVisitor(&liveObjects);
-    visitActiveDOMNodes(&activeNodeVisitor);
-    v8::V8::AddObjectGroup(liveObjects.data(), liveObjects.size());
 
-    NodeVisitor nodeVisitor;
+    NodeVisitor nodeVisitor(&liveObjects);
     visitAllDOMNodes(&nodeVisitor);
     nodeVisitor.applyGrouping();
 
+    v8::V8::AddObjectGroup(liveObjects.data(), liveObjects.size());
+
     ObjectVisitor objectVisitor;
     visitDOMObjects(&objectVisitor);
 
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to