Title: [131873] trunk/Source/WebCore
Revision
131873
Author
[email protected]
Date
2012-10-19 01:24:52 -0700 (Fri, 19 Oct 2012)

Log Message

[V8] Simplify GCPrologueVisitor
https://bugs.webkit.org/show_bug.cgi?id=99819

Reviewed by Kentaro Hara.

Previously, GCPrologueVisitor used a complicated traits-based template
design. That's not necessary. We can just implement it directly without
template magic.

The one subtly here is that MessagePort is not actually a subclass of
ActiveDOMObject. The next stage of this cleanup is to make MessagePort
inherit from ActiveDOMObject and remove this special case entirely.

* bindings/v8/V8GCController.cpp:
(WebCore::EnsureWeakDOMNodeVisitor::visitDOMWrapper):
(WebCore):
(WebCore::ActiveDOMObjectPrologueVisitor::visitDOMWrapper):
(WebCore::NodeVisitor::visitDOMWrapper):
(WebCore::V8GCController::gcPrologue):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (131872 => 131873)


--- trunk/Source/WebCore/ChangeLog	2012-10-19 08:02:24 UTC (rev 131872)
+++ trunk/Source/WebCore/ChangeLog	2012-10-19 08:24:52 UTC (rev 131873)
@@ -1,3 +1,25 @@
+2012-10-19  Adam Barth  <[email protected]>
+
+        [V8] Simplify GCPrologueVisitor
+        https://bugs.webkit.org/show_bug.cgi?id=99819
+
+        Reviewed by Kentaro Hara.
+
+        Previously, GCPrologueVisitor used a complicated traits-based template
+        design. That's not necessary. We can just implement it directly without
+        template magic.
+
+        The one subtly here is that MessagePort is not actually a subclass of
+        ActiveDOMObject. The next stage of this cleanup is to make MessagePort
+        inherit from ActiveDOMObject and remove this special case entirely.
+
+        * bindings/v8/V8GCController.cpp:
+        (WebCore::EnsureWeakDOMNodeVisitor::visitDOMWrapper):
+        (WebCore):
+        (WebCore::ActiveDOMObjectPrologueVisitor::visitDOMWrapper):
+        (WebCore::NodeVisitor::visitDOMWrapper):
+        (WebCore::V8GCController::gcPrologue):
+
 2012-10-19  Eugene Klyuchnikov  <[email protected]>
 
         Web Inspector: Saving HAR, snapshots and timeline data do not work in remote debugging mode

Modified: trunk/Source/WebCore/bindings/v8/V8GCController.cpp (131872 => 131873)


--- trunk/Source/WebCore/bindings/v8/V8GCController.cpp	2012-10-19 08:02:24 UTC (rev 131872)
+++ trunk/Source/WebCore/bindings/v8/V8GCController.cpp	2012-10-19 08:24:52 UTC (rev 131873)
@@ -70,63 +70,37 @@
 
 class EnsureWeakDOMNodeVisitor : public DOMWrapperMap<Node>::Visitor {
 public:
-    void visitDOMWrapper(DOMDataStore* store, Node* object, v8::Persistent<v8::Object> wrapper)
+    void visitDOMWrapper(DOMDataStore*, Node*, v8::Persistent<v8::Object> wrapper)
     {
-        UNUSED_PARAM(object);
         ASSERT(wrapper.IsWeak());
     }
 };
 
 #endif // NDEBUG
 
-class SpecialCasePrologueObjectHandler {
+template<typename T>
+class ActiveDOMObjectPrologueVisitor : public DOMWrapperMap<T>::Visitor {
 public:
-    static bool process(void* object, v8::Persistent<v8::Object> wrapper, WrapperTypeInfo* typeInfo)
+    void visitDOMWrapper(DOMDataStore*, T* object, v8::Persistent<v8::Object> wrapper)
     {
-        // Additional handling of message port ensuring that entangled ports also
-        // have their wrappers entangled. This should ideally be handled when the
-        // ports are actually entangled in MessagePort::entangle, but to avoid
-        // forking MessagePort.* this is postponed to GC time. Having this postponed
-        // has the drawback that the wrappers are "entangled/unentangled" for each
-        // GC even though their entaglement most likely is still the same.
+        WrapperTypeInfo* typeInfo = V8DOMWrapper::domWrapperType(wrapper);  
+
         if (V8MessagePort::info.equals(typeInfo)) {
-            // 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* port1 = static_cast<MessagePort*>(object);
-            if (port1->isEntangled() || port1->hasPendingActivity())
+            // 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);
+            if (port->isEntangled() || port->hasPendingActivity())
                 wrapper.ClearWeak();
-            return true;
+            return;
         }
-        return false;
-    }
-};
 
-class SpecialCasePrologueNodeHandler {
-public:
-    static bool process(Node* object, v8::Persistent<v8::Object> wrapper, WrapperTypeInfo* typeInfo)
-    {
-        UNUSED_PARAM(object);
-        UNUSED_PARAM(wrapper);
-        UNUSED_PARAM(typeInfo);
-        return false;
+        ActiveDOMObject* activeDOMObject = typeInfo->toActiveDOMObject(wrapper);
+        if (activeDOMObject && activeDOMObject->hasPendingActivity())
+            wrapper.ClearWeak();
     }
 };
 
-template<typename T, typename S>
-class GCPrologueVisitor : public DOMWrapperMap<T>::Visitor {
-public:
-    void visitDOMWrapper(DOMDataStore* store, T* object, v8::Persistent<v8::Object> wrapper)
-    {
-        WrapperTypeInfo* typeInfo = V8DOMWrapper::domWrapperType(wrapper);  
-
-        if (!S::process(object, wrapper, typeInfo)) {
-            ActiveDOMObject* activeDOMObject = typeInfo->toActiveDOMObject(wrapper);
-            if (activeDOMObject && activeDOMObject->hasPendingActivity())
-                wrapper.ClearWeak();
-        }
-    }
-};
-
 // Implements v8::RetainedObjectInfo.
 class UnspecifiedGroup : public RetainedObjectInfo {
 public:
@@ -254,7 +228,7 @@
 
 class NodeVisitor : public DOMWrapperMap<Node>::Visitor {
 public:
-    void visitDOMWrapper(DOMDataStore* store, Node* node, v8::Persistent<v8::Object> wrapper)
+    void visitDOMWrapper(DOMDataStore*, Node* node, v8::Persistent<v8::Object> wrapper)
     {
         if (node->hasEventListeners()) {
             Vector<v8::Persistent<v8::Value> > listeners;
@@ -329,12 +303,10 @@
 
     v8::HandleScope scope;
 
-    // Run through all objects with possible pending activity making their
-    // wrappers non weak if there is pending activity.
-    GCPrologueVisitor<void, SpecialCasePrologueObjectHandler> prologueObjectVisitor;
-    visitActiveDOMObjects(&prologueObjectVisitor);
-    GCPrologueVisitor<Node, SpecialCasePrologueNodeHandler> prologueNodeVisitor;
-    visitActiveDOMNodes(&prologueNodeVisitor);
+    ActiveDOMObjectPrologueVisitor<void> activeObjectVisitor;
+    visitActiveDOMObjects(&activeObjectVisitor);
+    ActiveDOMObjectPrologueVisitor<Node> activeNodeVisitor;
+    visitActiveDOMNodes(&activeNodeVisitor);
 
     NodeVisitor nodeVisitor;
     visitDOMNodes(&nodeVisitor);
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to