Title: [111813] trunk/Source/WebCore
Revision
111813
Author
[email protected]
Date
2012-03-22 19:38:05 -0700 (Thu, 22 Mar 2012)

Log Message

[v8] wrapSlow methods should ref underlying object before creating wrapper
https://bugs.webkit.org/show_bug.cgi?id=81919

Reviewed by Adam Barth.

Because instatiating the wrapper can trigger GC, it's important that
wrapSlow() hold a reference to an object when creating a wrapper for
that object. Once the V8 wrapper exists and is associated with the object,
the reference can be handed off (via leakRef) to be handled by the normal
binding code logic (where derefObject is called if the handle is GCed).

Binding tests have been updated to reflect this change.

Testing the change directly is hard. Any test landed today would only
be a valid test until V8's logic about when to GC changes, at which point
it would become dead weight. So I don't think it's worth landing a
layout test along with this.

* bindings/scripts/CodeGeneratorV8.pm:
(GenerateHeader): Make wrapSlow take a PassRefPtr for RefCounted objects.
(GenerateToV8Converters): Get rid of the explicit call to ref() and
instead call leakRef() when adding a RefCounted object to the DOM map.
(GetPassRefPtrType): Helper to generate "PassRefPtr<T>", or "PassRefPtr<T<U> >" as appropriate.
* bindings/scripts/test/V8/V8Float64Array.cpp:
(WebCore::V8Float64Array::wrapSlow):
* bindings/scripts/test/V8/V8Float64Array.h:
(V8Float64Array):
* bindings/scripts/test/V8/V8TestActiveDOMObject.cpp:
(WebCore::V8TestActiveDOMObject::wrapSlow):
* bindings/scripts/test/V8/V8TestActiveDOMObject.h:
(V8TestActiveDOMObject):
* bindings/scripts/test/V8/V8TestCustomNamedGetter.cpp:
(WebCore::V8TestCustomNamedGetter::wrapSlow):
* bindings/scripts/test/V8/V8TestCustomNamedGetter.h:
(V8TestCustomNamedGetter):
* bindings/scripts/test/V8/V8TestEventConstructor.cpp:
(WebCore::V8TestEventConstructor::wrapSlow):
* bindings/scripts/test/V8/V8TestEventConstructor.h:
(V8TestEventConstructor):
* bindings/scripts/test/V8/V8TestEventTarget.cpp:
(WebCore::V8TestEventTarget::wrapSlow):
* bindings/scripts/test/V8/V8TestEventTarget.h:
(V8TestEventTarget):
* bindings/scripts/test/V8/V8TestInterface.cpp:
(WebCore::V8TestInterface::wrapSlow):
* bindings/scripts/test/V8/V8TestInterface.h:
(V8TestInterface):
* bindings/scripts/test/V8/V8TestMediaQueryListListener.cpp:
(WebCore::V8TestMediaQueryListListener::wrapSlow):
* bindings/scripts/test/V8/V8TestMediaQueryListListener.h:
(V8TestMediaQueryListListener):
* bindings/scripts/test/V8/V8TestNamedConstructor.cpp:
(WebCore::V8TestNamedConstructor::wrapSlow):
* bindings/scripts/test/V8/V8TestNamedConstructor.h:
(V8TestNamedConstructor):
* bindings/scripts/test/V8/V8TestObj.cpp:
(WebCore::V8TestObj::wrapSlow):
* bindings/scripts/test/V8/V8TestObj.h:
(V8TestObj):
* bindings/scripts/test/V8/V8TestSerializedScriptValueInterface.cpp:
(WebCore::V8TestSerializedScriptValueInterface::wrapSlow):
* bindings/scripts/test/V8/V8TestSerializedScriptValueInterface.h:
(V8TestSerializedScriptValueInterface):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (111812 => 111813)


--- trunk/Source/WebCore/ChangeLog	2012-03-23 02:30:20 UTC (rev 111812)
+++ trunk/Source/WebCore/ChangeLog	2012-03-23 02:38:05 UTC (rev 111813)
@@ -1,3 +1,69 @@
+2012-03-22  Adam Klein  <[email protected]>
+
+        [v8] wrapSlow methods should ref underlying object before creating wrapper
+        https://bugs.webkit.org/show_bug.cgi?id=81919
+
+        Reviewed by Adam Barth.
+
+        Because instatiating the wrapper can trigger GC, it's important that
+        wrapSlow() hold a reference to an object when creating a wrapper for
+        that object. Once the V8 wrapper exists and is associated with the object,
+        the reference can be handed off (via leakRef) to be handled by the normal
+        binding code logic (where derefObject is called if the handle is GCed).
+
+        Binding tests have been updated to reflect this change.
+
+        Testing the change directly is hard. Any test landed today would only
+        be a valid test until V8's logic about when to GC changes, at which point
+        it would become dead weight. So I don't think it's worth landing a
+        layout test along with this.
+
+        * bindings/scripts/CodeGeneratorV8.pm:
+        (GenerateHeader): Make wrapSlow take a PassRefPtr for RefCounted objects.
+        (GenerateToV8Converters): Get rid of the explicit call to ref() and
+        instead call leakRef() when adding a RefCounted object to the DOM map.
+        (GetPassRefPtrType): Helper to generate "PassRefPtr<T>", or "PassRefPtr<T<U> >" as appropriate.
+        * bindings/scripts/test/V8/V8Float64Array.cpp:
+        (WebCore::V8Float64Array::wrapSlow):
+        * bindings/scripts/test/V8/V8Float64Array.h:
+        (V8Float64Array):
+        * bindings/scripts/test/V8/V8TestActiveDOMObject.cpp:
+        (WebCore::V8TestActiveDOMObject::wrapSlow):
+        * bindings/scripts/test/V8/V8TestActiveDOMObject.h:
+        (V8TestActiveDOMObject):
+        * bindings/scripts/test/V8/V8TestCustomNamedGetter.cpp:
+        (WebCore::V8TestCustomNamedGetter::wrapSlow):
+        * bindings/scripts/test/V8/V8TestCustomNamedGetter.h:
+        (V8TestCustomNamedGetter):
+        * bindings/scripts/test/V8/V8TestEventConstructor.cpp:
+        (WebCore::V8TestEventConstructor::wrapSlow):
+        * bindings/scripts/test/V8/V8TestEventConstructor.h:
+        (V8TestEventConstructor):
+        * bindings/scripts/test/V8/V8TestEventTarget.cpp:
+        (WebCore::V8TestEventTarget::wrapSlow):
+        * bindings/scripts/test/V8/V8TestEventTarget.h:
+        (V8TestEventTarget):
+        * bindings/scripts/test/V8/V8TestInterface.cpp:
+        (WebCore::V8TestInterface::wrapSlow):
+        * bindings/scripts/test/V8/V8TestInterface.h:
+        (V8TestInterface):
+        * bindings/scripts/test/V8/V8TestMediaQueryListListener.cpp:
+        (WebCore::V8TestMediaQueryListListener::wrapSlow):
+        * bindings/scripts/test/V8/V8TestMediaQueryListListener.h:
+        (V8TestMediaQueryListListener):
+        * bindings/scripts/test/V8/V8TestNamedConstructor.cpp:
+        (WebCore::V8TestNamedConstructor::wrapSlow):
+        * bindings/scripts/test/V8/V8TestNamedConstructor.h:
+        (V8TestNamedConstructor):
+        * bindings/scripts/test/V8/V8TestObj.cpp:
+        (WebCore::V8TestObj::wrapSlow):
+        * bindings/scripts/test/V8/V8TestObj.h:
+        (V8TestObj):
+        * bindings/scripts/test/V8/V8TestSerializedScriptValueInterface.cpp:
+        (WebCore::V8TestSerializedScriptValueInterface::wrapSlow):
+        * bindings/scripts/test/V8/V8TestSerializedScriptValueInterface.h:
+        (V8TestSerializedScriptValueInterface):
+
 2012-03-22  Jonathan Dong  <[email protected]>
 
         [BlackBerry] add interface clearCredentials() and clearNeverRememberSites()

Modified: trunk/Source/WebCore/bindings/scripts/CodeGeneratorV8.pm (111812 => 111813)


--- trunk/Source/WebCore/bindings/scripts/CodeGeneratorV8.pm	2012-03-23 02:30:20 UTC (rev 111812)
+++ trunk/Source/WebCore/bindings/scripts/CodeGeneratorV8.pm	2012-03-23 02:38:05 UTC (rev 111813)
@@ -422,9 +422,10 @@
 END
     }
 
+    my $wrapSlowArgumentType = GetPassRefPtrType($nativeType);
     push(@headerContent, <<END);
 private:
-    static v8::Handle<v8::Object> wrapSlow(${nativeType}*);
+    static v8::Handle<v8::Object> wrapSlow(${wrapSlowArgumentType});
 };
 
 END
@@ -3108,10 +3109,11 @@
     my $domMapFunction = GetDomMapFunction($dataNode, $interfaceName);
     my $forceNewObjectInput = IsDOMNodeType($interfaceName) ? ", bool forceNewObject" : "";
     my $forceNewObjectCall = IsDOMNodeType($interfaceName) ? ", forceNewObject" : "";
+    my $wrapSlowArgumentType = GetPassRefPtrType($nativeType);
 
     push(@implContent, <<END);
 
-v8::Handle<v8::Object> ${className}::wrapSlow(${nativeType}* impl)
+v8::Handle<v8::Object> ${className}::wrapSlow(${wrapSlowArgumentType} impl)
 {
     v8::Handle<v8::Object> wrapper;
 END
@@ -3134,7 +3136,7 @@
         push(@implContent, <<END);
     if (proxy && proxy->windowShell()->context().IsEmpty() && proxy->windowShell()->initContextIfNeeded()) {
         // initContextIfNeeded may have created a wrapper for the object, retry from the start.
-        return ${className}::wrap(impl);
+        return ${className}::wrap(impl.get());
     }
 END
     }
@@ -3166,7 +3168,7 @@
     }
 
     push(@implContent, <<END);
-    wrapper = V8DOMWrapper::instantiateV8Object(proxy, &info, impl);
+    wrapper = V8DOMWrapper::instantiateV8Object(proxy, &info, impl.get());
 END
     if (IsNodeSubType($dataNode) || IsVisibleAcrossOrigins($dataNode)) {
         push(@implContent, <<END);
@@ -3179,10 +3181,7 @@
     push(@implContent, <<END);
     if (UNLIKELY(wrapper.IsEmpty()))
         return wrapper;
-END
-    push(@implContent, "\n    impl->ref();\n") if IsRefPtrType($interfaceName);
 
-    push(@implContent, <<END);
     v8::Persistent<v8::Object> wrapperHandle = v8::Persistent<v8::Object>::New(wrapper);
 
     if (!hasDependentLifetime)
@@ -3192,12 +3191,9 @@
         push(@implContent, <<END);
     wrapperHandle.SetWrapperClassId(v8DOMSubtreeClassId);
 END
-    }    
+    }
     push(@implContent, <<END);
-    ${domMapFunction}.set(impl, wrapperHandle);
-END
-
-    push(@implContent, <<END);
+    ${domMapFunction}.set(impl.leakRef(), wrapperHandle);
     return wrapper;
 }
 END
@@ -3929,6 +3925,14 @@
     return "RuntimeEnabledFeatures::" . $codeGenerator->WK_lcfirst($signature->name) . "Enabled";
 }
 
+sub GetPassRefPtrType
+{
+    my $className = shift;
+
+    my $angleBracketSpace = $className =~ />$/ ? " " : "";
+    return "PassRefPtr<${className}${angleBracketSpace}>";
+}
+
 sub DebugPrint
 {
     my $output = shift;

Modified: trunk/Source/WebCore/bindings/scripts/test/V8/V8Float64Array.cpp (111812 => 111813)


--- trunk/Source/WebCore/bindings/scripts/test/V8/V8Float64Array.cpp	2012-03-23 02:30:20 UTC (rev 111812)
+++ trunk/Source/WebCore/bindings/scripts/test/V8/V8Float64Array.cpp	2012-03-23 02:38:05 UTC (rev 111813)
@@ -120,20 +120,19 @@
 }
 
 
-v8::Handle<v8::Object> V8Float64Array::wrapSlow(Float64Array* impl)
+v8::Handle<v8::Object> V8Float64Array::wrapSlow(PassRefPtr<Float64Array> impl)
 {
     v8::Handle<v8::Object> wrapper;
     V8Proxy* proxy = 0;
-    wrapper = V8DOMWrapper::instantiateV8Object(proxy, &info, impl);
+    wrapper = V8DOMWrapper::instantiateV8Object(proxy, &info, impl.get());
     if (UNLIKELY(wrapper.IsEmpty()))
         return wrapper;
 
-    impl->ref();
     v8::Persistent<v8::Object> wrapperHandle = v8::Persistent<v8::Object>::New(wrapper);
 
     if (!hasDependentLifetime)
         wrapperHandle.MarkIndependent();
-    getDOMObjectMap().set(impl, wrapperHandle);
+    getDOMObjectMap().set(impl.leakRef(), wrapperHandle);
     return wrapper;
 }
 

Modified: trunk/Source/WebCore/bindings/scripts/test/V8/V8Float64Array.h (111812 => 111813)


--- trunk/Source/WebCore/bindings/scripts/test/V8/V8Float64Array.h	2012-03-23 02:30:20 UTC (rev 111812)
+++ trunk/Source/WebCore/bindings/scripts/test/V8/V8Float64Array.h	2012-03-23 02:38:05 UTC (rev 111813)
@@ -47,7 +47,7 @@
     static v8::Handle<v8::Value> constructorCallback(const v8::Arguments&);
     static const int internalFieldCount = v8DefaultWrapperInternalFieldCount + 0;
 private:
-    static v8::Handle<v8::Object> wrapSlow(Float64Array*);
+    static v8::Handle<v8::Object> wrapSlow(PassRefPtr<Float64Array>);
 };
 
 v8::Handle<v8::Object> V8Float64Array::wrap(Float64Array* impl)

Modified: trunk/Source/WebCore/bindings/scripts/test/V8/V8TestActiveDOMObject.cpp (111812 => 111813)


--- trunk/Source/WebCore/bindings/scripts/test/V8/V8TestActiveDOMObject.cpp	2012-03-23 02:30:20 UTC (rev 111812)
+++ trunk/Source/WebCore/bindings/scripts/test/V8/V8TestActiveDOMObject.cpp	2012-03-23 02:38:05 UTC (rev 111813)
@@ -158,7 +158,7 @@
 }
 
 
-v8::Handle<v8::Object> V8TestActiveDOMObject::wrapSlow(TestActiveDOMObject* impl)
+v8::Handle<v8::Object> V8TestActiveDOMObject::wrapSlow(PassRefPtr<TestActiveDOMObject> impl)
 {
     v8::Handle<v8::Object> wrapper;
     V8Proxy* proxy = 0;
@@ -175,19 +175,18 @@
     // Enter the node's context and create the wrapper in that context.
     if (!context.IsEmpty())
         context->Enter();
-    wrapper = V8DOMWrapper::instantiateV8Object(proxy, &info, impl);
+    wrapper = V8DOMWrapper::instantiateV8Object(proxy, &info, impl.get());
     // Exit the node's context if it was entered.
     if (!context.IsEmpty())
         context->Exit();
     if (UNLIKELY(wrapper.IsEmpty()))
         return wrapper;
 
-    impl->ref();
     v8::Persistent<v8::Object> wrapperHandle = v8::Persistent<v8::Object>::New(wrapper);
 
     if (!hasDependentLifetime)
         wrapperHandle.MarkIndependent();
-    getDOMObjectMap().set(impl, wrapperHandle);
+    getDOMObjectMap().set(impl.leakRef(), wrapperHandle);
     return wrapper;
 }
 

Modified: trunk/Source/WebCore/bindings/scripts/test/V8/V8TestActiveDOMObject.h (111812 => 111813)


--- trunk/Source/WebCore/bindings/scripts/test/V8/V8TestActiveDOMObject.h	2012-03-23 02:30:20 UTC (rev 111812)
+++ trunk/Source/WebCore/bindings/scripts/test/V8/V8TestActiveDOMObject.h	2012-03-23 02:38:05 UTC (rev 111813)
@@ -47,7 +47,7 @@
     static bool namedSecurityCheck(v8::Local<v8::Object> host, v8::Local<v8::Value> key, v8::AccessType, v8::Local<v8::Value> data);
     static bool indexedSecurityCheck(v8::Local<v8::Object> host, uint32_t index, v8::AccessType, v8::Local<v8::Value> data);
 private:
-    static v8::Handle<v8::Object> wrapSlow(TestActiveDOMObject*);
+    static v8::Handle<v8::Object> wrapSlow(PassRefPtr<TestActiveDOMObject>);
 };
 
 v8::Handle<v8::Object> V8TestActiveDOMObject::wrap(TestActiveDOMObject* impl)

Modified: trunk/Source/WebCore/bindings/scripts/test/V8/V8TestCustomNamedGetter.cpp (111812 => 111813)


--- trunk/Source/WebCore/bindings/scripts/test/V8/V8TestCustomNamedGetter.cpp	2012-03-23 02:30:20 UTC (rev 111812)
+++ trunk/Source/WebCore/bindings/scripts/test/V8/V8TestCustomNamedGetter.cpp	2012-03-23 02:38:05 UTC (rev 111813)
@@ -110,20 +110,19 @@
 }
 
 
-v8::Handle<v8::Object> V8TestCustomNamedGetter::wrapSlow(TestCustomNamedGetter* impl)
+v8::Handle<v8::Object> V8TestCustomNamedGetter::wrapSlow(PassRefPtr<TestCustomNamedGetter> impl)
 {
     v8::Handle<v8::Object> wrapper;
     V8Proxy* proxy = 0;
-    wrapper = V8DOMWrapper::instantiateV8Object(proxy, &info, impl);
+    wrapper = V8DOMWrapper::instantiateV8Object(proxy, &info, impl.get());
     if (UNLIKELY(wrapper.IsEmpty()))
         return wrapper;
 
-    impl->ref();
     v8::Persistent<v8::Object> wrapperHandle = v8::Persistent<v8::Object>::New(wrapper);
 
     if (!hasDependentLifetime)
         wrapperHandle.MarkIndependent();
-    getDOMObjectMap().set(impl, wrapperHandle);
+    getDOMObjectMap().set(impl.leakRef(), wrapperHandle);
     return wrapper;
 }
 

Modified: trunk/Source/WebCore/bindings/scripts/test/V8/V8TestCustomNamedGetter.h (111812 => 111813)


--- trunk/Source/WebCore/bindings/scripts/test/V8/V8TestCustomNamedGetter.h	2012-03-23 02:30:20 UTC (rev 111812)
+++ trunk/Source/WebCore/bindings/scripts/test/V8/V8TestCustomNamedGetter.h	2012-03-23 02:38:05 UTC (rev 111813)
@@ -46,7 +46,7 @@
     static v8::Handle<v8::Value> namedPropertyGetter(v8::Local<v8::String>, const v8::AccessorInfo&);
     static const int internalFieldCount = v8DefaultWrapperInternalFieldCount + 0;
 private:
-    static v8::Handle<v8::Object> wrapSlow(TestCustomNamedGetter*);
+    static v8::Handle<v8::Object> wrapSlow(PassRefPtr<TestCustomNamedGetter>);
 };
 
 v8::Handle<v8::Object> V8TestCustomNamedGetter::wrap(TestCustomNamedGetter* impl)

Modified: trunk/Source/WebCore/bindings/scripts/test/V8/V8TestEventConstructor.cpp (111812 => 111813)


--- trunk/Source/WebCore/bindings/scripts/test/V8/V8TestEventConstructor.cpp	2012-03-23 02:30:20 UTC (rev 111812)
+++ trunk/Source/WebCore/bindings/scripts/test/V8/V8TestEventConstructor.cpp	2012-03-23 02:38:05 UTC (rev 111813)
@@ -145,20 +145,19 @@
 }
 
 
-v8::Handle<v8::Object> V8TestEventConstructor::wrapSlow(TestEventConstructor* impl)
+v8::Handle<v8::Object> V8TestEventConstructor::wrapSlow(PassRefPtr<TestEventConstructor> impl)
 {
     v8::Handle<v8::Object> wrapper;
     V8Proxy* proxy = 0;
-    wrapper = V8DOMWrapper::instantiateV8Object(proxy, &info, impl);
+    wrapper = V8DOMWrapper::instantiateV8Object(proxy, &info, impl.get());
     if (UNLIKELY(wrapper.IsEmpty()))
         return wrapper;
 
-    impl->ref();
     v8::Persistent<v8::Object> wrapperHandle = v8::Persistent<v8::Object>::New(wrapper);
 
     if (!hasDependentLifetime)
         wrapperHandle.MarkIndependent();
-    getDOMObjectMap().set(impl, wrapperHandle);
+    getDOMObjectMap().set(impl.leakRef(), wrapperHandle);
     return wrapper;
 }
 

Modified: trunk/Source/WebCore/bindings/scripts/test/V8/V8TestEventConstructor.h (111812 => 111813)


--- trunk/Source/WebCore/bindings/scripts/test/V8/V8TestEventConstructor.h	2012-03-23 02:30:20 UTC (rev 111812)
+++ trunk/Source/WebCore/bindings/scripts/test/V8/V8TestEventConstructor.h	2012-03-23 02:38:05 UTC (rev 111813)
@@ -47,7 +47,7 @@
     static v8::Handle<v8::Value> constructorCallback(const v8::Arguments&);
     static const int internalFieldCount = v8DefaultWrapperInternalFieldCount + 0;
 private:
-    static v8::Handle<v8::Object> wrapSlow(TestEventConstructor*);
+    static v8::Handle<v8::Object> wrapSlow(PassRefPtr<TestEventConstructor>);
 };
 
 v8::Handle<v8::Object> V8TestEventConstructor::wrap(TestEventConstructor* impl)

Modified: trunk/Source/WebCore/bindings/scripts/test/V8/V8TestEventTarget.cpp (111812 => 111813)


--- trunk/Source/WebCore/bindings/scripts/test/V8/V8TestEventTarget.cpp	2012-03-23 02:30:20 UTC (rev 111812)
+++ trunk/Source/WebCore/bindings/scripts/test/V8/V8TestEventTarget.cpp	2012-03-23 02:38:05 UTC (rev 111813)
@@ -173,20 +173,19 @@
 }
 
 
-v8::Handle<v8::Object> V8TestEventTarget::wrapSlow(TestEventTarget* impl)
+v8::Handle<v8::Object> V8TestEventTarget::wrapSlow(PassRefPtr<TestEventTarget> impl)
 {
     v8::Handle<v8::Object> wrapper;
     V8Proxy* proxy = 0;
-    wrapper = V8DOMWrapper::instantiateV8Object(proxy, &info, impl);
+    wrapper = V8DOMWrapper::instantiateV8Object(proxy, &info, impl.get());
     if (UNLIKELY(wrapper.IsEmpty()))
         return wrapper;
 
-    impl->ref();
     v8::Persistent<v8::Object> wrapperHandle = v8::Persistent<v8::Object>::New(wrapper);
 
     if (!hasDependentLifetime)
         wrapperHandle.MarkIndependent();
-    getDOMObjectMap().set(impl, wrapperHandle);
+    getDOMObjectMap().set(impl.leakRef(), wrapperHandle);
     return wrapper;
 }
 

Modified: trunk/Source/WebCore/bindings/scripts/test/V8/V8TestEventTarget.h (111812 => 111813)


--- trunk/Source/WebCore/bindings/scripts/test/V8/V8TestEventTarget.h	2012-03-23 02:30:20 UTC (rev 111812)
+++ trunk/Source/WebCore/bindings/scripts/test/V8/V8TestEventTarget.h	2012-03-23 02:38:05 UTC (rev 111813)
@@ -48,7 +48,7 @@
     static const int eventListenerCacheIndex = v8DefaultWrapperInternalFieldCount + 0;
     static const int internalFieldCount = v8DefaultWrapperInternalFieldCount + 1;
 private:
-    static v8::Handle<v8::Object> wrapSlow(TestEventTarget*);
+    static v8::Handle<v8::Object> wrapSlow(PassRefPtr<TestEventTarget>);
 };
 
 v8::Handle<v8::Object> V8TestEventTarget::wrap(TestEventTarget* impl)

Modified: trunk/Source/WebCore/bindings/scripts/test/V8/V8TestInterface.cpp (111812 => 111813)


--- trunk/Source/WebCore/bindings/scripts/test/V8/V8TestInterface.cpp	2012-03-23 02:30:20 UTC (rev 111812)
+++ trunk/Source/WebCore/bindings/scripts/test/V8/V8TestInterface.cpp	2012-03-23 02:38:05 UTC (rev 111813)
@@ -306,20 +306,19 @@
     return toNative(object);
 }      
 
-v8::Handle<v8::Object> V8TestInterface::wrapSlow(TestInterface* impl)
+v8::Handle<v8::Object> V8TestInterface::wrapSlow(PassRefPtr<TestInterface> impl)
 {
     v8::Handle<v8::Object> wrapper;
     V8Proxy* proxy = 0;
-    wrapper = V8DOMWrapper::instantiateV8Object(proxy, &info, impl);
+    wrapper = V8DOMWrapper::instantiateV8Object(proxy, &info, impl.get());
     if (UNLIKELY(wrapper.IsEmpty()))
         return wrapper;
 
-    impl->ref();
     v8::Persistent<v8::Object> wrapperHandle = v8::Persistent<v8::Object>::New(wrapper);
 
     if (!hasDependentLifetime)
         wrapperHandle.MarkIndependent();
-    getActiveDOMObjectMap().set(impl, wrapperHandle);
+    getActiveDOMObjectMap().set(impl.leakRef(), wrapperHandle);
     return wrapper;
 }
 

Modified: trunk/Source/WebCore/bindings/scripts/test/V8/V8TestInterface.h (111812 => 111813)


--- trunk/Source/WebCore/bindings/scripts/test/V8/V8TestInterface.h	2012-03-23 02:30:20 UTC (rev 111812)
+++ trunk/Source/WebCore/bindings/scripts/test/V8/V8TestInterface.h	2012-03-23 02:38:05 UTC (rev 111813)
@@ -50,7 +50,7 @@
     static v8::Handle<v8::Value> namedPropertySetter(v8::Local<v8::String>, v8::Local<v8::Value>, const v8::AccessorInfo&);
     static const int internalFieldCount = v8DefaultWrapperInternalFieldCount + 0;
 private:
-    static v8::Handle<v8::Object> wrapSlow(TestInterface*);
+    static v8::Handle<v8::Object> wrapSlow(PassRefPtr<TestInterface>);
 };
 
 v8::Handle<v8::Object> V8TestInterface::wrap(TestInterface* impl)

Modified: trunk/Source/WebCore/bindings/scripts/test/V8/V8TestMediaQueryListListener.cpp (111812 => 111813)


--- trunk/Source/WebCore/bindings/scripts/test/V8/V8TestMediaQueryListListener.cpp	2012-03-23 02:30:20 UTC (rev 111812)
+++ trunk/Source/WebCore/bindings/scripts/test/V8/V8TestMediaQueryListListener.cpp	2012-03-23 02:38:05 UTC (rev 111813)
@@ -110,20 +110,19 @@
 }
 
 
-v8::Handle<v8::Object> V8TestMediaQueryListListener::wrapSlow(TestMediaQueryListListener* impl)
+v8::Handle<v8::Object> V8TestMediaQueryListListener::wrapSlow(PassRefPtr<TestMediaQueryListListener> impl)
 {
     v8::Handle<v8::Object> wrapper;
     V8Proxy* proxy = 0;
-    wrapper = V8DOMWrapper::instantiateV8Object(proxy, &info, impl);
+    wrapper = V8DOMWrapper::instantiateV8Object(proxy, &info, impl.get());
     if (UNLIKELY(wrapper.IsEmpty()))
         return wrapper;
 
-    impl->ref();
     v8::Persistent<v8::Object> wrapperHandle = v8::Persistent<v8::Object>::New(wrapper);
 
     if (!hasDependentLifetime)
         wrapperHandle.MarkIndependent();
-    getDOMObjectMap().set(impl, wrapperHandle);
+    getDOMObjectMap().set(impl.leakRef(), wrapperHandle);
     return wrapper;
 }
 

Modified: trunk/Source/WebCore/bindings/scripts/test/V8/V8TestMediaQueryListListener.h (111812 => 111813)


--- trunk/Source/WebCore/bindings/scripts/test/V8/V8TestMediaQueryListListener.h	2012-03-23 02:30:20 UTC (rev 111812)
+++ trunk/Source/WebCore/bindings/scripts/test/V8/V8TestMediaQueryListListener.h	2012-03-23 02:38:05 UTC (rev 111813)
@@ -45,7 +45,7 @@
     static WrapperTypeInfo info;
     static const int internalFieldCount = v8DefaultWrapperInternalFieldCount + 0;
 private:
-    static v8::Handle<v8::Object> wrapSlow(TestMediaQueryListListener*);
+    static v8::Handle<v8::Object> wrapSlow(PassRefPtr<TestMediaQueryListListener>);
 };
 
 v8::Handle<v8::Object> V8TestMediaQueryListListener::wrap(TestMediaQueryListListener* impl)

Modified: trunk/Source/WebCore/bindings/scripts/test/V8/V8TestNamedConstructor.cpp (111812 => 111813)


--- trunk/Source/WebCore/bindings/scripts/test/V8/V8TestNamedConstructor.cpp	2012-03-23 02:30:20 UTC (rev 111812)
+++ trunk/Source/WebCore/bindings/scripts/test/V8/V8TestNamedConstructor.cpp	2012-03-23 02:38:05 UTC (rev 111813)
@@ -155,20 +155,19 @@
     return toNative(object);
 }      
 
-v8::Handle<v8::Object> V8TestNamedConstructor::wrapSlow(TestNamedConstructor* impl)
+v8::Handle<v8::Object> V8TestNamedConstructor::wrapSlow(PassRefPtr<TestNamedConstructor> impl)
 {
     v8::Handle<v8::Object> wrapper;
     V8Proxy* proxy = 0;
-    wrapper = V8DOMWrapper::instantiateV8Object(proxy, &info, impl);
+    wrapper = V8DOMWrapper::instantiateV8Object(proxy, &info, impl.get());
     if (UNLIKELY(wrapper.IsEmpty()))
         return wrapper;
 
-    impl->ref();
     v8::Persistent<v8::Object> wrapperHandle = v8::Persistent<v8::Object>::New(wrapper);
 
     if (!hasDependentLifetime)
         wrapperHandle.MarkIndependent();
-    getActiveDOMObjectMap().set(impl, wrapperHandle);
+    getActiveDOMObjectMap().set(impl.leakRef(), wrapperHandle);
     return wrapper;
 }
 

Modified: trunk/Source/WebCore/bindings/scripts/test/V8/V8TestNamedConstructor.h (111812 => 111813)


--- trunk/Source/WebCore/bindings/scripts/test/V8/V8TestNamedConstructor.h	2012-03-23 02:30:20 UTC (rev 111812)
+++ trunk/Source/WebCore/bindings/scripts/test/V8/V8TestNamedConstructor.h	2012-03-23 02:38:05 UTC (rev 111813)
@@ -52,7 +52,7 @@
     static ActiveDOMObject* toActiveDOMObject(v8::Handle<v8::Object>);
     static const int internalFieldCount = v8DefaultWrapperInternalFieldCount + 0;
 private:
-    static v8::Handle<v8::Object> wrapSlow(TestNamedConstructor*);
+    static v8::Handle<v8::Object> wrapSlow(PassRefPtr<TestNamedConstructor>);
 };
 
 v8::Handle<v8::Object> V8TestNamedConstructor::wrap(TestNamedConstructor* impl)

Modified: trunk/Source/WebCore/bindings/scripts/test/V8/V8TestObj.cpp (111812 => 111813)


--- trunk/Source/WebCore/bindings/scripts/test/V8/V8TestObj.cpp	2012-03-23 02:30:20 UTC (rev 111812)
+++ trunk/Source/WebCore/bindings/scripts/test/V8/V8TestObj.cpp	2012-03-23 02:38:05 UTC (rev 111813)
@@ -2138,20 +2138,19 @@
 }
 
 
-v8::Handle<v8::Object> V8TestObj::wrapSlow(TestObj* impl)
+v8::Handle<v8::Object> V8TestObj::wrapSlow(PassRefPtr<TestObj> impl)
 {
     v8::Handle<v8::Object> wrapper;
     V8Proxy* proxy = 0;
-    wrapper = V8DOMWrapper::instantiateV8Object(proxy, &info, impl);
+    wrapper = V8DOMWrapper::instantiateV8Object(proxy, &info, impl.get());
     if (UNLIKELY(wrapper.IsEmpty()))
         return wrapper;
 
-    impl->ref();
     v8::Persistent<v8::Object> wrapperHandle = v8::Persistent<v8::Object>::New(wrapper);
 
     if (!hasDependentLifetime)
         wrapperHandle.MarkIndependent();
-    getDOMObjectMap().set(impl, wrapperHandle);
+    getDOMObjectMap().set(impl.leakRef(), wrapperHandle);
     return wrapper;
 }
 

Modified: trunk/Source/WebCore/bindings/scripts/test/V8/V8TestObj.h (111812 => 111813)


--- trunk/Source/WebCore/bindings/scripts/test/V8/V8TestObj.h	2012-03-23 02:30:20 UTC (rev 111812)
+++ trunk/Source/WebCore/bindings/scripts/test/V8/V8TestObj.h	2012-03-23 02:38:05 UTC (rev 111813)
@@ -51,7 +51,7 @@
     static void customAttrAccessorSetter(v8::Local<v8::String> name, v8::Local<v8::Value>, const v8::AccessorInfo&);
     static const int internalFieldCount = v8DefaultWrapperInternalFieldCount + 0;
 private:
-    static v8::Handle<v8::Object> wrapSlow(TestObj*);
+    static v8::Handle<v8::Object> wrapSlow(PassRefPtr<TestObj>);
 };
 
 v8::Handle<v8::Object> V8TestObj::wrap(TestObj* impl)

Modified: trunk/Source/WebCore/bindings/scripts/test/V8/V8TestSerializedScriptValueInterface.cpp (111812 => 111813)


--- trunk/Source/WebCore/bindings/scripts/test/V8/V8TestSerializedScriptValueInterface.cpp	2012-03-23 02:30:20 UTC (rev 111812)
+++ trunk/Source/WebCore/bindings/scripts/test/V8/V8TestSerializedScriptValueInterface.cpp	2012-03-23 02:38:05 UTC (rev 111813)
@@ -277,20 +277,19 @@
 }
 
 
-v8::Handle<v8::Object> V8TestSerializedScriptValueInterface::wrapSlow(TestSerializedScriptValueInterface* impl)
+v8::Handle<v8::Object> V8TestSerializedScriptValueInterface::wrapSlow(PassRefPtr<TestSerializedScriptValueInterface> impl)
 {
     v8::Handle<v8::Object> wrapper;
     V8Proxy* proxy = 0;
-    wrapper = V8DOMWrapper::instantiateV8Object(proxy, &info, impl);
+    wrapper = V8DOMWrapper::instantiateV8Object(proxy, &info, impl.get());
     if (UNLIKELY(wrapper.IsEmpty()))
         return wrapper;
 
-    impl->ref();
     v8::Persistent<v8::Object> wrapperHandle = v8::Persistent<v8::Object>::New(wrapper);
 
     if (!hasDependentLifetime)
         wrapperHandle.MarkIndependent();
-    getDOMObjectMap().set(impl, wrapperHandle);
+    getDOMObjectMap().set(impl.leakRef(), wrapperHandle);
     return wrapper;
 }
 

Modified: trunk/Source/WebCore/bindings/scripts/test/V8/V8TestSerializedScriptValueInterface.h (111812 => 111813)


--- trunk/Source/WebCore/bindings/scripts/test/V8/V8TestSerializedScriptValueInterface.h	2012-03-23 02:30:20 UTC (rev 111812)
+++ trunk/Source/WebCore/bindings/scripts/test/V8/V8TestSerializedScriptValueInterface.h	2012-03-23 02:38:05 UTC (rev 111813)
@@ -48,7 +48,7 @@
     static v8::Handle<v8::Value> constructorCallback(const v8::Arguments&);
     static const int internalFieldCount = v8DefaultWrapperInternalFieldCount + 0;
 private:
-    static v8::Handle<v8::Object> wrapSlow(TestSerializedScriptValueInterface*);
+    static v8::Handle<v8::Object> wrapSlow(PassRefPtr<TestSerializedScriptValueInterface>);
 };
 
 v8::Handle<v8::Object> V8TestSerializedScriptValueInterface::wrap(TestSerializedScriptValueInterface* impl)
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to