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);