Title: [112163] trunk/Source/WebCore
Revision
112163
Author
[email protected]
Date
2012-03-26 15:57:22 -0700 (Mon, 26 Mar 2012)

Log Message

Use PassRefPtr in V8DOMWrapper interface to avoid explicit ref() calls
https://bugs.webkit.org/show_bug.cgi?id=82238

Reviewed by Adam Barth.

The setJSWrapper* methods previously featured a comment that asked
callers to ref the objects before passing them in. This change makes
that contract explicit (and allows the removal of the comment).

In addition, for ConstructorCallbacks, this change slightly reduces
refcount churn by passing on the initial ref via RefPtr::release().

No new tests, no change in behavior.

* bindings/scripts/CodeGeneratorV8.pm:
(GenerateConstructorCallback): Use RefPtr::release() to avoid refcount churn and remove explicit ref() call.
(GenerateNamedConstructorCallback): ditto.
* bindings/v8/V8DOMWindowShell.cpp:
(WebCore::V8DOMWindowShell::installDOMWindow): Cast to a PassRefPtr and remove explicit ref call.
* bindings/v8/V8DOMWrapper.cpp:
(WebCore::V8DOMWrapper::setJSWrapperForDOMNode): Pass leaked refs into the DOMNodeMaps.
* bindings/v8/V8DOMWrapper.h:
(V8DOMWrapper): Make the setJSWrapperFor* methods take PassRefPtr<T>.
(WebCore::V8DOMWrapper::setJSWrapperForDOMObject): Pass leaked ref into the DOMObjectMap.
(WebCore::V8DOMWrapper::setJSWrapperForActiveDOMObject): Pass leaked ref into the ActiveDOMObjectMap.
* bindings/v8/V8Proxy.h:
(WebCore::toV8): Remove explicit ref.
* bindings/v8/WorkerContextExecutionProxy.cpp:
(WebCore::WorkerContextExecutionProxy::initContextIfNeeded): Cast to a PassRefPTr and remove explicit ref call.
* bindings/v8/custom/V8HTMLImageElementConstructor.cpp:
(WebCore::v8HTMLImageElementConstructorCallback): Use RefPtr::release() to avoid refcount churn and remove explicit ref.
* bindings/v8/custom/V8WebKitMutationObserverCustom.cpp:
(WebCore::V8WebKitMutationObserver::constructorCallback): ditto.
* bindings/v8/custom/V8WebSocketCustom.cpp:
(WebCore::V8WebSocket::constructorCallback): ditto.
* bindings/v8/custom/V8XMLHttpRequestConstructor.cpp:
(WebCore::V8XMLHttpRequest::constructorCallback): ditto.

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (112162 => 112163)


--- trunk/Source/WebCore/ChangeLog	2012-03-26 22:51:32 UTC (rev 112162)
+++ trunk/Source/WebCore/ChangeLog	2012-03-26 22:57:22 UTC (rev 112163)
@@ -1,3 +1,43 @@
+2012-03-26  Adam Klein  <[email protected]>
+
+        Use PassRefPtr in V8DOMWrapper interface to avoid explicit ref() calls
+        https://bugs.webkit.org/show_bug.cgi?id=82238
+
+        Reviewed by Adam Barth.
+
+        The setJSWrapper* methods previously featured a comment that asked
+        callers to ref the objects before passing them in. This change makes
+        that contract explicit (and allows the removal of the comment).
+
+        In addition, for ConstructorCallbacks, this change slightly reduces
+        refcount churn by passing on the initial ref via RefPtr::release().
+
+        No new tests, no change in behavior.
+
+        * bindings/scripts/CodeGeneratorV8.pm:
+        (GenerateConstructorCallback): Use RefPtr::release() to avoid refcount churn and remove explicit ref() call.
+        (GenerateNamedConstructorCallback): ditto.
+        * bindings/v8/V8DOMWindowShell.cpp:
+        (WebCore::V8DOMWindowShell::installDOMWindow): Cast to a PassRefPtr and remove explicit ref call.
+        * bindings/v8/V8DOMWrapper.cpp:
+        (WebCore::V8DOMWrapper::setJSWrapperForDOMNode): Pass leaked refs into the DOMNodeMaps.
+        * bindings/v8/V8DOMWrapper.h:
+        (V8DOMWrapper): Make the setJSWrapperFor* methods take PassRefPtr<T>.
+        (WebCore::V8DOMWrapper::setJSWrapperForDOMObject): Pass leaked ref into the DOMObjectMap.
+        (WebCore::V8DOMWrapper::setJSWrapperForActiveDOMObject): Pass leaked ref into the ActiveDOMObjectMap.
+        * bindings/v8/V8Proxy.h:
+        (WebCore::toV8): Remove explicit ref.
+        * bindings/v8/WorkerContextExecutionProxy.cpp:
+        (WebCore::WorkerContextExecutionProxy::initContextIfNeeded): Cast to a PassRefPTr and remove explicit ref call.
+        * bindings/v8/custom/V8HTMLImageElementConstructor.cpp:
+        (WebCore::v8HTMLImageElementConstructorCallback): Use RefPtr::release() to avoid refcount churn and remove explicit ref.
+        * bindings/v8/custom/V8WebKitMutationObserverCustom.cpp:
+        (WebCore::V8WebKitMutationObserver::constructorCallback): ditto.
+        * bindings/v8/custom/V8WebSocketCustom.cpp:
+        (WebCore::V8WebSocket::constructorCallback): ditto.
+        * bindings/v8/custom/V8XMLHttpRequestConstructor.cpp:
+        (WebCore::V8XMLHttpRequest::constructorCallback): ditto.
+
 2012-03-26  Alexey Proskuryakov  <[email protected]>
 
         Remove obsolete FormDataStreamMac code

Modified: trunk/Source/WebCore/bindings/scripts/CodeGeneratorV8.pm (112162 => 112163)


--- trunk/Source/WebCore/bindings/scripts/CodeGeneratorV8.pm	2012-03-26 22:51:32 UTC (rev 112162)
+++ trunk/Source/WebCore/bindings/scripts/CodeGeneratorV8.pm	2012-03-26 22:57:22 UTC (rev 112163)
@@ -1762,8 +1762,7 @@
     push(@implContent, <<END);
 
     V8DOMWrapper::setDOMWrapper(wrapper, &info, impl.get());
-    impl->ref();
-    V8DOMWrapper::setJSWrapperFor${DOMObject}(impl.get(), v8::Persistent<v8::Object>::New(wrapper));
+    V8DOMWrapper::setJSWrapperFor${DOMObject}(impl.release(), v8::Persistent<v8::Object>::New(wrapper));
     return args.Holder();
 END
 
@@ -1944,8 +1943,7 @@
     push(@implContent, <<END);
 
     V8DOMWrapper::setDOMWrapper(wrapper, &V8${implClassName}Constructor::info, impl.get());
-    impl->ref();
-    V8DOMWrapper::setJSWrapperFor${DOMObject}(impl.get(), v8::Persistent<v8::Object>::New(wrapper));
+    V8DOMWrapper::setJSWrapperFor${DOMObject}(impl.release(), v8::Persistent<v8::Object>::New(wrapper));
     return args.Holder();
 END
 

Modified: trunk/Source/WebCore/bindings/v8/V8DOMWindowShell.cpp (112162 => 112163)


--- trunk/Source/WebCore/bindings/v8/V8DOMWindowShell.cpp	2012-03-26 22:51:32 UTC (rev 112162)
+++ trunk/Source/WebCore/bindings/v8/V8DOMWindowShell.cpp	2012-03-26 22:57:22 UTC (rev 112163)
@@ -414,8 +414,7 @@
     V8DOMWrapper::setDOMWrapper(jsWindow, &V8DOMWindow::info, window);
     V8DOMWrapper::setDOMWrapper(v8::Handle<v8::Object>::Cast(jsWindow->GetPrototype()), &V8DOMWindow::info, window);
 
-    window->ref();
-    V8DOMWrapper::setJSWrapperForDOMObject(window, v8::Persistent<v8::Object>::New(jsWindow));
+    V8DOMWrapper::setJSWrapperForDOMObject(PassRefPtr<DOMWindow>(window), v8::Persistent<v8::Object>::New(jsWindow));
 
     // Insert the window instance as the prototype of the shadow object.
     v8::Handle<v8::Object> v8RealGlobal = v8::Handle<v8::Object>::Cast(context->Global()->GetPrototype());

Modified: trunk/Source/WebCore/bindings/v8/V8DOMWrapper.cpp (112162 => 112163)


--- trunk/Source/WebCore/bindings/v8/V8DOMWrapper.cpp	2012-03-26 22:51:32 UTC (rev 112162)
+++ trunk/Source/WebCore/bindings/v8/V8DOMWrapper.cpp	2012-03-26 22:57:22 UTC (rev 112163)
@@ -66,30 +66,13 @@
 
 namespace WebCore {
 
-// The caller must have increased obj's ref count.
-void V8DOMWrapper::setJSWrapperForDOMObject(void* object, v8::Persistent<v8::Object> wrapper)
+void V8DOMWrapper::setJSWrapperForDOMNode(PassRefPtr<Node> node, v8::Persistent<v8::Object> wrapper)
 {
-    ASSERT(V8DOMWrapper::maybeDOMWrapper(wrapper));
-    ASSERT(!domWrapperType(wrapper)->toActiveDOMObjectFunction);
-    getDOMObjectMap().set(object, wrapper);
-}
-
-// The caller must have increased obj's ref count.
-void V8DOMWrapper::setJSWrapperForActiveDOMObject(void* object, v8::Persistent<v8::Object> wrapper)
-{
-    ASSERT(V8DOMWrapper::maybeDOMWrapper(wrapper));
-    ASSERT(domWrapperType(wrapper)->toActiveDOMObjectFunction);
-    getActiveDOMObjectMap().set(object, wrapper);
-}
-
-// The caller must have increased node's ref count.
-void V8DOMWrapper::setJSWrapperForDOMNode(Node* node, v8::Persistent<v8::Object> wrapper)
-{
-    ASSERT(V8DOMWrapper::maybeDOMWrapper(wrapper));
+    ASSERT(maybeDOMWrapper(wrapper));
     if (node->isActiveNode())
-        getActiveDOMNodeMap().set(node, wrapper);
+        getActiveDOMNodeMap().set(node.leakRef(), wrapper);
     else
-        getDOMNodeMap().set(node, wrapper);
+        getDOMNodeMap().set(node.leakRef(), wrapper);
 }
 
 v8::Local<v8::Function> V8DOMWrapper::getConstructor(WrapperTypeInfo* type, v8::Handle<v8::Value> objectPrototype)

Modified: trunk/Source/WebCore/bindings/v8/V8DOMWrapper.h (112162 => 112163)


--- trunk/Source/WebCore/bindings/v8/V8DOMWrapper.h	2012-03-26 22:51:32 UTC (rev 112162)
+++ trunk/Source/WebCore/bindings/v8/V8DOMWrapper.h	2012-03-26 22:57:22 UTC (rev 112163)
@@ -38,6 +38,7 @@
 #include "NodeFilter.h"
 #include "PlatformString.h"
 #include "V8CustomXPathNSResolver.h"
+#include "V8DOMMap.h"
 #include "V8Event.h"
 #include "V8IsolatedContext.h"
 #include "V8Utilities.h"
@@ -46,6 +47,7 @@
 #include "XPathNSResolver.h"
 #include <v8.h>
 #include <wtf/MainThread.h>
+#include <wtf/PassRefPtr.h>
 
 namespace WebCore {
 
@@ -105,10 +107,9 @@
         static v8::Local<v8::Function> getConstructor(WrapperTypeInfo*, WorkerContext*);
 #endif
 
-        // Set JS wrapper of a DOM object, the caller in charge of increase ref.
-        static void setJSWrapperForDOMObject(void*, v8::Persistent<v8::Object>);
-        static void setJSWrapperForActiveDOMObject(void*, v8::Persistent<v8::Object>);
-        static void setJSWrapperForDOMNode(Node*, v8::Persistent<v8::Object>);
+        template<typename T> static void setJSWrapperForDOMObject(PassRefPtr<T>, v8::Persistent<v8::Object>);
+        template<typename T> static void setJSWrapperForActiveDOMObject(PassRefPtr<T>, v8::Persistent<v8::Object>);
+        static void setJSWrapperForDOMNode(PassRefPtr<Node>, v8::Persistent<v8::Object>);
 
         static bool isValidDOMObject(v8::Handle<v8::Value>);
 
@@ -148,6 +149,21 @@
         }
     };
 
-}
+    template<typename T>
+    void V8DOMWrapper::setJSWrapperForDOMObject(PassRefPtr<T> object, v8::Persistent<v8::Object> wrapper)
+    {
+        ASSERT(maybeDOMWrapper(wrapper));
+        ASSERT(!domWrapperType(wrapper)->toActiveDOMObjectFunction);
+        getDOMObjectMap().set(object.leakRef(), wrapper);
+    }
 
+    template<typename T>
+    void V8DOMWrapper::setJSWrapperForActiveDOMObject(PassRefPtr<T> object, v8::Persistent<v8::Object> wrapper)
+    {
+        ASSERT(maybeDOMWrapper(wrapper));
+        ASSERT(domWrapperType(wrapper)->toActiveDOMObjectFunction);
+        getActiveDOMObjectMap().set(object.leakRef(), wrapper);
+    }
+} // namespace WebCore
+
 #endif // V8DOMWrapper_h

Modified: trunk/Source/WebCore/bindings/v8/V8Proxy.h (112162 => 112163)


--- trunk/Source/WebCore/bindings/v8/V8Proxy.h	2012-03-26 22:51:32 UTC (rev 112162)
+++ trunk/Source/WebCore/bindings/v8/V8Proxy.h	2012-03-26 22:57:22 UTC (rev 112163)
@@ -351,11 +351,10 @@
 
     template <class T> inline v8::Handle<v8::Object> toV8(PassRefPtr<T> object, v8::Local<v8::Object> holder, IndependentMode independent = DoNotMarkIndependent)
     {
-        object->ref();
         v8::Persistent<v8::Object> handle = v8::Persistent<v8::Object>::New(holder);
         if (independent == MarkIndependent)
             handle.MarkIndependent();
-        V8DOMWrapper::setJSWrapperForDOMObject(object.get(), handle);
+        V8DOMWrapper::setJSWrapperForDOMObject(object, handle);
         return holder;
     }
 

Modified: trunk/Source/WebCore/bindings/v8/WorkerContextExecutionProxy.cpp (112162 => 112163)


--- trunk/Source/WebCore/bindings/v8/WorkerContextExecutionProxy.cpp	2012-03-26 22:51:32 UTC (rev 112162)
+++ trunk/Source/WebCore/bindings/v8/WorkerContextExecutionProxy.cpp	2012-03-26 22:57:22 UTC (rev 112163)
@@ -168,8 +168,7 @@
     // Wrap the object.
     V8DOMWrapper::setDOMWrapper(jsWorkerContext, contextType, m_workerContext);
 
-    V8DOMWrapper::setJSWrapperForDOMObject(m_workerContext, v8::Persistent<v8::Object>::New(jsWorkerContext));
-    m_workerContext->ref();
+    V8DOMWrapper::setJSWrapperForDOMObject(PassRefPtr<WorkerContext>(m_workerContext), v8::Persistent<v8::Object>::New(jsWorkerContext));
 
     // Insert the object instance as the prototype of the shadow object.
     v8::Handle<v8::Object> globalObject = v8::Handle<v8::Object>::Cast(m_context->Global()->GetPrototype());

Modified: trunk/Source/WebCore/bindings/v8/custom/V8HTMLImageElementConstructor.cpp (112162 => 112163)


--- trunk/Source/WebCore/bindings/v8/custom/V8HTMLImageElementConstructor.cpp	2012-03-26 22:51:32 UTC (rev 112162)
+++ trunk/Source/WebCore/bindings/v8/custom/V8HTMLImageElementConstructor.cpp	2012-03-26 22:57:22 UTC (rev 112163)
@@ -86,8 +86,7 @@
 
     RefPtr<HTMLImageElement> image = HTMLImageElement::createForJSConstructor(document, optionalWidth, optionalHeight);
     V8DOMWrapper::setDOMWrapper(args.Holder(), &V8HTMLImageElementConstructor::info, image.get());
-    image->ref();
-    V8DOMWrapper::setJSWrapperForDOMNode(image.get(), v8::Persistent<v8::Object>::New(args.Holder()));
+    V8DOMWrapper::setJSWrapperForDOMNode(image.release(), v8::Persistent<v8::Object>::New(args.Holder()));
     return args.Holder();
 }
 

Modified: trunk/Source/WebCore/bindings/v8/custom/V8WebKitMutationObserverCustom.cpp (112162 => 112163)


--- trunk/Source/WebCore/bindings/v8/custom/V8WebKitMutationObserverCustom.cpp	2012-03-26 22:51:32 UTC (rev 112162)
+++ trunk/Source/WebCore/bindings/v8/custom/V8WebKitMutationObserverCustom.cpp	2012-03-26 22:57:22 UTC (rev 112163)
@@ -75,8 +75,7 @@
     RefPtr<WebKitMutationObserver> observer = WebKitMutationObserver::create(callback.release());
 
     V8DOMWrapper::setDOMWrapper(args.Holder(), &info, observer.get());
-    observer->ref();
-    V8DOMWrapper::setJSWrapperForDOMObject(observer.get(), v8::Persistent<v8::Object>::New(args.Holder()));
+    V8DOMWrapper::setJSWrapperForDOMObject(observer.release(), v8::Persistent<v8::Object>::New(args.Holder()));
     return args.Holder();
 }
 

Modified: trunk/Source/WebCore/bindings/v8/custom/V8WebSocketCustom.cpp (112162 => 112163)


--- trunk/Source/WebCore/bindings/v8/custom/V8WebSocketCustom.cpp	2012-03-26 22:51:32 UTC (rev 112162)
+++ trunk/Source/WebCore/bindings/v8/custom/V8WebSocketCustom.cpp	2012-03-26 22:57:22 UTC (rev 112163)
@@ -107,13 +107,8 @@
     if (ec)
         return throwError(ec);
 
-    // Setup the standard wrapper object internal fields.
     V8DOMWrapper::setDOMWrapper(args.Holder(), &info, webSocket.get());
-
-    // Add object to the wrapper map.
-    webSocket->ref();
-    V8DOMWrapper::setJSWrapperForActiveDOMObject(webSocket.get(), v8::Persistent<v8::Object>::New(args.Holder()));
-
+    V8DOMWrapper::setJSWrapperForActiveDOMObject(webSocket.release(), v8::Persistent<v8::Object>::New(args.Holder()));
     return args.Holder();
 }
 

Modified: trunk/Source/WebCore/bindings/v8/custom/V8XMLHttpRequestConstructor.cpp (112162 => 112163)


--- trunk/Source/WebCore/bindings/v8/custom/V8XMLHttpRequestConstructor.cpp	2012-03-26 22:51:32 UTC (rev 112162)
+++ trunk/Source/WebCore/bindings/v8/custom/V8XMLHttpRequestConstructor.cpp	2012-03-26 22:57:22 UTC (rev 112163)
@@ -64,10 +64,7 @@
         securityOrigin = isolatedContext->securityOrigin();
     RefPtr<XMLHttpRequest> xmlHttpRequest = XMLHttpRequest::create(context, securityOrigin);
     V8DOMWrapper::setDOMWrapper(args.Holder(), &info, xmlHttpRequest.get());
-
-    // Add object to the wrapper map.
-    xmlHttpRequest->ref();
-    V8DOMWrapper::setJSWrapperForActiveDOMObject(xmlHttpRequest.get(), v8::Persistent<v8::Object>::New(args.Holder()));
+    V8DOMWrapper::setJSWrapperForActiveDOMObject(xmlHttpRequest.release(), v8::Persistent<v8::Object>::New(args.Holder()));
     return args.Holder();
 }
 
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to