Title: [126521] trunk/Source/WebCore
Revision
126521
Author
[email protected]
Date
2012-08-23 18:02:28 -0700 (Thu, 23 Aug 2012)

Log Message

[V8] V8AbstractEventListener re-implements ScopedPersistent by hand
https://bugs.webkit.org/show_bug.cgi?id=94873

Reviewed by Eric Seidel.

Rather than calling New/Dispose manually, this patch changes
V8AbstractEventListener to use ScopedPersistent.

* bindings/v8/V8AbstractEventListener.cpp:
(WebCore::V8AbstractEventListener::weakEventListenerCallback):
(WebCore::V8AbstractEventListener::~V8AbstractEventListener):
(WebCore::V8AbstractEventListener::setListenerObject):
(WebCore::V8AbstractEventListener::getReceiverObject):
* bindings/v8/V8AbstractEventListener.h:
(WebCore::V8AbstractEventListener::getListenerObject):
(WebCore::V8AbstractEventListener::getExistingListenerObject):
(WebCore::V8AbstractEventListener::existingListenerObjectPersistentHandle):
(WebCore::V8AbstractEventListener::hasExistingListenerObject):
(V8AbstractEventListener):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (126520 => 126521)


--- trunk/Source/WebCore/ChangeLog	2012-08-24 00:52:53 UTC (rev 126520)
+++ trunk/Source/WebCore/ChangeLog	2012-08-24 01:02:28 UTC (rev 126521)
@@ -1,3 +1,25 @@
+2012-08-23  Adam Barth  <[email protected]>
+
+        [V8] V8AbstractEventListener re-implements ScopedPersistent by hand
+        https://bugs.webkit.org/show_bug.cgi?id=94873
+
+        Reviewed by Eric Seidel.
+
+        Rather than calling New/Dispose manually, this patch changes
+        V8AbstractEventListener to use ScopedPersistent.
+
+        * bindings/v8/V8AbstractEventListener.cpp:
+        (WebCore::V8AbstractEventListener::weakEventListenerCallback):
+        (WebCore::V8AbstractEventListener::~V8AbstractEventListener):
+        (WebCore::V8AbstractEventListener::setListenerObject):
+        (WebCore::V8AbstractEventListener::getReceiverObject):
+        * bindings/v8/V8AbstractEventListener.h:
+        (WebCore::V8AbstractEventListener::getListenerObject):
+        (WebCore::V8AbstractEventListener::getExistingListenerObject):
+        (WebCore::V8AbstractEventListener::existingListenerObjectPersistentHandle):
+        (WebCore::V8AbstractEventListener::hasExistingListenerObject):
+        (V8AbstractEventListener):
+
 2012-08-23  Simon Fraser  <[email protected]>
 
         Prep work for: Implement sticky positioning

Modified: trunk/Source/WebCore/bindings/v8/V8AbstractEventListener.cpp (126520 => 126521)


--- trunk/Source/WebCore/bindings/v8/V8AbstractEventListener.cpp	2012-08-24 00:52:53 UTC (rev 126520)
+++ trunk/Source/WebCore/bindings/v8/V8AbstractEventListener.cpp	2012-08-24 01:02:28 UTC (rev 126521)
@@ -47,10 +47,10 @@
 
 namespace WebCore {
 
-static void weakEventListenerCallback(v8::Persistent<v8::Value>, void* parameter)
+void V8AbstractEventListener::weakEventListenerCallback(v8::Persistent<v8::Value>, void* parameter)
 {
     V8AbstractEventListener* listener = static_cast<V8AbstractEventListener*>(parameter);
-    listener->disposeListenerObject();
+    listener->m_listener.clear();
 }
 
 V8AbstractEventListener::V8AbstractEventListener(bool isAttribute, const WorldContextHandle& worldContext)
@@ -65,12 +65,10 @@
 
 V8AbstractEventListener::~V8AbstractEventListener()
 {
-    if (!m_listener.IsEmpty()) {
+    if (!m_listener.get().IsEmpty()) {
         v8::HandleScope scope;
-        v8::Local<v8::Object> listener = v8::Local<v8::Object>::New(m_listener);
-        V8EventListenerList::clearWrapper(listener, m_isAttribute);
+        V8EventListenerList::clearWrapper(v8::Local<v8::Object>::New(m_listener.get()), m_isAttribute);
     }
-    disposeListenerObject();
 #if ENABLE(INSPECTOR)
     ThreadLocalInspectorCounters::current().decrementCounter(ThreadLocalInspectorCounters::JSEventListenerCounter);
 #endif
@@ -104,25 +102,10 @@
     invokeEventHandler(context, event, jsEvent);
 }
 
-void V8AbstractEventListener::disposeListenerObject()
-{
-    if (!m_listener.IsEmpty()) {
-#ifndef NDEBUG
-        V8GCController::unregisterGlobalHandle(this, m_listener);
-#endif
-        m_listener.Dispose();
-        m_listener.Clear();
-    }
-}
-
 void V8AbstractEventListener::setListenerObject(v8::Handle<v8::Object> listener)
 {
-    disposeListenerObject();
-    m_listener = v8::Persistent<v8::Object>::New(listener);
-#ifndef NDEBUG
-    V8GCController::registerGlobalHandle(EVENT_LISTENER, this, m_listener);
-#endif
-    m_listener.MakeWeak(this, &weakEventListenerCallback);
+    m_listener.set(listener);
+    m_listener.get().MakeWeak(this, &V8AbstractEventListener::weakEventListenerCallback);
 }
 
 void V8AbstractEventListener::invokeEventHandler(ScriptExecutionContext* context, Event* event, v8::Handle<v8::Value> jsEvent)
@@ -201,8 +184,8 @@
 
 v8::Local<v8::Object> V8AbstractEventListener::getReceiverObject(Event* event)
 {
-    if (!m_listener.IsEmpty() && !m_listener->IsFunction())
-        return v8::Local<v8::Object>::New(m_listener);
+    if (!m_listener.get().IsEmpty() && !m_listener.get()->IsFunction())
+        return v8::Local<v8::Object>::New(m_listener.get());
 
     EventTarget* target = event->currentTarget();
     v8::Handle<v8::Value> value = V8DOMWrapper::convertEventTargetToV8Object(target);

Modified: trunk/Source/WebCore/bindings/v8/V8AbstractEventListener.h (126520 => 126521)


--- trunk/Source/WebCore/bindings/v8/V8AbstractEventListener.h	2012-08-24 00:52:53 UTC (rev 126520)
+++ trunk/Source/WebCore/bindings/v8/V8AbstractEventListener.h	2012-08-24 01:02:28 UTC (rev 126521)
@@ -32,8 +32,8 @@
 #define V8AbstractEventListener_h
 
 #include "EventListener.h"
+#include "ScopedPersistent.h"
 #include "WorldContextHandle.h"
-
 #include <v8.h>
 #include <wtf/PassRefPtr.h>
 #include <wtf/RefCounted.h>
@@ -78,29 +78,26 @@
         v8::Local<v8::Object> getListenerObject(ScriptExecutionContext* context)
         {
             prepareListenerObject(context);
-            return v8::Local<v8::Object>::New(m_listener);
+            return v8::Local<v8::Object>::New(m_listener.get());
         }
 
         v8::Local<v8::Object> getExistingListenerObject()
         {
-            return v8::Local<v8::Object>::New(m_listener);
+            return v8::Local<v8::Object>::New(m_listener.get());
         }
 
         // Provides access to the underlying handle for GC. Returned
         // value is a weak handle and so not guaranteed to stay alive.
         v8::Persistent<v8::Object> existingListenerObjectPersistentHandle()
         {
-            return m_listener;
+            return m_listener.get();
         }
 
         bool hasExistingListenerObject()
         {
-            return !m_listener.IsEmpty();
+            return !m_listener.get().IsEmpty();
         }
 
-        // Dispose listener object and clear the handle.
-        void disposeListenerObject();
-
         const WorldContextHandle& worldContext() const { return m_worldContext; }
 
     protected:
@@ -116,6 +113,8 @@
         v8::Local<v8::Object> getReceiverObject(Event*);
 
     private:
+        static void weakEventListenerCallback(v8::Persistent<v8::Value>, void* parameter);
+
         // Implementation of EventListener function.
         virtual bool virtualisAttribute() const { return m_isAttribute; }
 
@@ -123,7 +122,7 @@
 
         virtual bool shouldPreventDefault(v8::Local<v8::Value> returnValue);
 
-        v8::Persistent<v8::Object> m_listener;
+        ScopedPersistent<v8::Object> m_listener;
 
         // Indicates if this is an HTML type listener.
         bool m_isAttribute;
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to