Title: [108010] trunk/Source
Revision
108010
Author
[email protected]
Date
2012-02-16 17:56:13 -0800 (Thu, 16 Feb 2012)

Log Message

Made Weak<T> single-owner, adding PassWeak<T>
https://bugs.webkit.org/show_bug.cgi?id=78740

Reviewed by Sam Weinig.

Source/_javascript_Core: 

This works basically the same way as OwnPtr<T> and PassOwnPtr<T>.

This clarifies the semantics of finalizers: It's ambiguous and probably
a bug to copy a finalizer (i.e., it's a bug to run a C++ destructor
twice), so I've made Weak<T> non-copyable. Anywhere we used to copy a 
Weak<T>, we now use PassWeak<T>.

This also makes Weak<T> HashMaps more efficient.

* API/JSClassRef.cpp:
(OpaqueJSClass::prototype): Use PassWeak<T> instead of set(), since 
set() is gone now.

* _javascript_Core.xcodeproj/project.pbxproj: Export!

* heap/PassWeak.h: Added.
(JSC):
(PassWeak):
(JSC::PassWeak::PassWeak):
(JSC::PassWeak::~PassWeak):
(JSC::PassWeak::get):
(JSC::::leakHandle):
(JSC::adoptWeak):
(JSC::operator==):
(JSC::operator!=): This is the Weak<T> version of PassOwnPtr<T>.

* heap/Weak.h:
(Weak):
(JSC::Weak::Weak):
(JSC::Weak::release):
(JSC::Weak::hashTableDeletedValue):
(JSC::=):
(JSC): Changed to be non-copyable, removing a lot of copying-related
APIs. Added hash traits so hash maps still work.

* jit/JITStubs.cpp:
(JSC::JITThunks::hostFunctionStub):
* runtime/RegExpCache.cpp:
(JSC::RegExpCache::lookupOrCreate): Use PassWeak<T>, as required by
our new hash map API.

Source/WebCore: 

* bindings/js/JSDOMBinding.cpp:
(WebCore::jsStringSlowCase): Use PassWeak<T>, as required by our new
hash map API.

* bindings/js/JSDOMBinding.h:
(WebCore::getCachedWrapper):
(WebCore::cacheWrapper): Use PassWeak<T> and raw pointer, as required by
our new hash map API.

* bindings/js/JSEventListener.h:
(WebCore::JSEventListener::setWrapper):
* bindings/js/ScriptWrappable.h:
(WebCore::ScriptWrappable::setWrapper):
* bridge/jsc/BridgeJSC.cpp:
(JSC::Bindings::Instance::createRuntimeObject):
* bridge/runtime_root.cpp:
(JSC::Bindings::RootObject::addRuntimeObject): Use PassWeak<T>, as
required by our new hash map and Weak<T> APIs.

Source/WebKit2: 

* WebProcess/Plugins/Netscape/NPRuntimeObjectMap.cpp:
(WebKit::NPRuntimeObjectMap::getOrCreateJSObject): Use raw pointer and
PassWeak<T>, as required by our new hash map API.

Modified Paths

Added Paths

Diff

Modified: trunk/Source/_javascript_Core/API/JSClassRef.cpp (108009 => 108010)


--- trunk/Source/_javascript_Core/API/JSClassRef.cpp	2012-02-17 01:43:50 UTC (rev 108009)
+++ trunk/Source/_javascript_Core/API/JSClassRef.cpp	2012-02-17 01:56:13 UTC (rev 108010)
@@ -222,7 +222,7 @@
 
     if (!jsClassData.cachedPrototype) {
         // Recursive, but should be good enough for our purposes
-        jsClassData.cachedPrototype.set(exec->globalData(), JSCallbackObject<JSNonFinalObject>::create(exec, exec->lexicalGlobalObject(), exec->lexicalGlobalObject()->callbackObjectStructure(), prototypeClass, &jsClassData), 0); // set jsClassData as the object's private data, so it can clear our reference on destruction
+        jsClassData.cachedPrototype = PassWeak<JSObject>(exec->globalData(), JSCallbackObject<JSNonFinalObject>::create(exec, exec->lexicalGlobalObject(), exec->lexicalGlobalObject()->callbackObjectStructure(), prototypeClass, &jsClassData), 0); // set jsClassData as the object's private data, so it can clear our reference on destruction
         if (parentClass) {
             if (JSObject* prototype = parentClass->prototype(exec))
                 jsClassData.cachedPrototype->setPrototype(exec->globalData(), prototype);

Modified: trunk/Source/_javascript_Core/ChangeLog (108009 => 108010)


--- trunk/Source/_javascript_Core/ChangeLog	2012-02-17 01:43:50 UTC (rev 108009)
+++ trunk/Source/_javascript_Core/ChangeLog	2012-02-17 01:56:13 UTC (rev 108010)
@@ -1,3 +1,51 @@
+2012-02-15  Geoffrey Garen  <[email protected]>
+
+        Made Weak<T> single-owner, adding PassWeak<T>
+        https://bugs.webkit.org/show_bug.cgi?id=78740
+
+        Reviewed by Sam Weinig.
+
+        This works basically the same way as OwnPtr<T> and PassOwnPtr<T>.
+
+        This clarifies the semantics of finalizers: It's ambiguous and probably
+        a bug to copy a finalizer (i.e., it's a bug to run a C++ destructor
+        twice), so I've made Weak<T> non-copyable. Anywhere we used to copy a 
+        Weak<T>, we now use PassWeak<T>.
+
+        This also makes Weak<T> HashMaps more efficient.
+
+        * API/JSClassRef.cpp:
+        (OpaqueJSClass::prototype): Use PassWeak<T> instead of set(), since 
+        set() is gone now.
+
+        * _javascript_Core.xcodeproj/project.pbxproj: Export!
+
+        * heap/PassWeak.h: Added.
+        (JSC):
+        (PassWeak):
+        (JSC::PassWeak::PassWeak):
+        (JSC::PassWeak::~PassWeak):
+        (JSC::PassWeak::get):
+        (JSC::::leakHandle):
+        (JSC::adoptWeak):
+        (JSC::operator==):
+        (JSC::operator!=): This is the Weak<T> version of PassOwnPtr<T>.
+
+        * heap/Weak.h:
+        (Weak):
+        (JSC::Weak::Weak):
+        (JSC::Weak::release):
+        (JSC::Weak::hashTableDeletedValue):
+        (JSC::=):
+        (JSC): Changed to be non-copyable, removing a lot of copying-related
+        APIs. Added hash traits so hash maps still work.
+
+        * jit/JITStubs.cpp:
+        (JSC::JITThunks::hostFunctionStub):
+        * runtime/RegExpCache.cpp:
+        (JSC::RegExpCache::lookupOrCreate): Use PassWeak<T>, as required by
+        our new hash map API.
+
 2012-02-16  Mark Hahnenberg  <[email protected]>
 
         Fix the broken viewport tests

Modified: trunk/Source/_javascript_Core/_javascript_Core.xcodeproj/project.pbxproj (108009 => 108010)


--- trunk/Source/_javascript_Core/_javascript_Core.xcodeproj/project.pbxproj	2012-02-17 01:43:50 UTC (rev 108009)
+++ trunk/Source/_javascript_Core/_javascript_Core.xcodeproj/project.pbxproj	2012-02-17 01:56:13 UTC (rev 108010)
@@ -266,6 +266,7 @@
 		148F21B7107EC5470042EC2C /* Nodes.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F692A86D0255597D01FF60F7 /* Nodes.cpp */; };
 		148F21BC107EC54D0042EC2C /* Parser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 93F0B3A909BB4DC00068FCE3 /* Parser.cpp */; };
 		149559EE0DDCDDF700648087 /* DebuggerCallFrame.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 149559ED0DDCDDF700648087 /* DebuggerCallFrame.cpp */; };
+		1497209114EB831500FEB1B7 /* PassWeak.h in Headers */ = {isa = PBXBuildFile; fileRef = 1497209014EB831500FEB1B7 /* PassWeak.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		14A1563210966365006FA260 /* DateInstanceCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 14A1563010966365006FA260 /* DateInstanceCache.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		14A23D750F4E1ABB0023CDAD /* JITStubs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 14A23D6C0F4E19CE0023CDAD /* JITStubs.cpp */; };
 		14A42E3F0F4F60EE00599099 /* TimeoutChecker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 14A42E3D0F4F60EE00599099 /* TimeoutChecker.cpp */; };
@@ -1030,6 +1031,7 @@
 		148A1ECD0D10C23B0069A47C /* RefPtrHashMap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RefPtrHashMap.h; sourceTree = "<group>"; };
 		148CD1D7108CF902008163C6 /* JSContextRefPrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSContextRefPrivate.h; sourceTree = "<group>"; };
 		149559ED0DDCDDF700648087 /* DebuggerCallFrame.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DebuggerCallFrame.cpp; sourceTree = "<group>"; };
+		1497209014EB831500FEB1B7 /* PassWeak.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PassWeak.h; sourceTree = "<group>"; };
 		149B24FF0D8AF6D1009CB8C7 /* Register.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Register.h; sourceTree = "<group>"; };
 		149DAAF212EB559D0083B12B /* ConservativeRoots.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ConservativeRoots.h; sourceTree = "<group>"; };
 		14A1563010966365006FA260 /* DateInstanceCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DateInstanceCache.h; sourceTree = "<group>"; };
@@ -1856,6 +1858,7 @@
 				14D2F3D9139F4BE200491031 /* MarkedSpace.h */,
 				142D6F0E13539A4100B02E86 /* MarkStack.cpp */,
 				142D6F0F13539A4100B02E86 /* MarkStack.h */,
+				1497209014EB831500FEB1B7 /* PassWeak.h */,
 				14BA78F013AAB88F005B7C2C /* SlotVisitor.h */,
 				142E3132134FF0A600AFADB5 /* Strong.h */,
 				145722851437E140005FDE26 /* StrongInlines.h */,
@@ -3226,6 +3229,7 @@
 				0F9FC8C414E1B60000D52AE0 /* PolymorphicPutByIdList.h in Headers */,
 				0F9FC8C514E1B60400D52AE0 /* PutKind.h in Headers */,
 				BCBE2CAE14E985AA000593AD /* GCAssertions.h in Headers */,
+				1497209114EB831500FEB1B7 /* PassWeak.h in Headers */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};

Added: trunk/Source/_javascript_Core/heap/PassWeak.h (0 => 108010)


--- trunk/Source/_javascript_Core/heap/PassWeak.h	                        (rev 0)
+++ trunk/Source/_javascript_Core/heap/PassWeak.h	2012-02-17 01:56:13 UTC (rev 108010)
@@ -0,0 +1,147 @@
+/*
+ * Copyright (C) 2012 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+#ifndef PassWeak_h
+#define PassWeak_h
+
+#include "Assertions.h"
+#include "Handle.h"
+#include "NullPtr.h"
+#include "TypeTraits.h"
+
+namespace JSC {
+
+template<typename T> class Weak;
+template<typename T> class PassWeak;
+template<typename T> PassWeak<T> adoptWeak(HandleSlot);
+
+template<typename T> class PassWeak : public Handle<T> {
+    using Handle<T>::slot;
+    using Handle<T>::setSlot;
+
+public:
+    typedef typename Handle<T>::ExternalType ExternalType;
+
+    PassWeak() : Handle<T>() { }
+    PassWeak(std::nullptr_t) : Handle<T>() { }
+
+    PassWeak(JSGlobalData& globalData, ExternalType externalType = ExternalType(), WeakHandleOwner* weakOwner = 0, void* context = 0)
+        : Handle<T>(globalData.heap.handleHeap()->allocate())
+    {
+        HandleHeap::heapFor(slot())->makeWeak(slot(), weakOwner, context);
+        JSValue value = HandleTypes<T>::toJSValue(externalType);
+        HandleHeap::heapFor(slot())->writeBarrier(slot(), value);
+        *slot() = value;
+    }
+
+    // It somewhat breaks the type system to allow transfer of ownership out of
+    // a const PassWeak. However, it makes it much easier to work with PassWeak
+    // temporaries, and we don't have a need to use real const PassWeaks anyway.
+    PassWeak(const PassWeak& o) : Handle<T>(o.leakHandle()) { }
+    template<typename U> PassWeak(const PassWeak<U>& o) : Handle<T>(o.leakHandle()) { }
+
+    ~PassWeak()
+    {
+        if (!slot())
+            return;
+        HandleHeap::heapFor(slot())->deallocate(slot());
+        setSlot(0);
+    }
+
+    ExternalType get() const { return  HandleTypes<T>::getFromSlot(slot()); }
+
+    HandleSlot leakHandle() const WARN_UNUSED_RETURN;
+
+private:
+    friend PassWeak adoptWeak<T>(HandleSlot);
+
+    explicit PassWeak(HandleSlot slot) : Handle<T>(slot) { }
+};
+
+template<typename T> inline HandleSlot PassWeak<T>::leakHandle() const
+{
+    HandleSlot slot = this->slot();
+    const_cast<PassWeak<T>*>(this)->setSlot(0);
+    return slot;
+}
+
+template<typename T> PassWeak<T> adoptWeak(HandleSlot slot)
+{
+    return PassWeak<T>(slot);
+}
+
+template<typename T, typename U> inline bool operator==(const PassWeak<T>& a, const PassWeak<U>& b) 
+{
+    return a.get() == b.get(); 
+}
+
+template<typename T, typename U> inline bool operator==(const PassWeak<T>& a, const Weak<U>& b) 
+{
+    return a.get() == b.get(); 
+}
+
+template<typename T, typename U> inline bool operator==(const Weak<T>& a, const PassWeak<U>& b) 
+{
+    return a.get() == b.get(); 
+}
+
+template<typename T, typename U> inline bool operator==(const PassWeak<T>& a, U* b) 
+{
+    return a.get() == b; 
+}
+
+template<typename T, typename U> inline bool operator==(T* a, const PassWeak<U>& b) 
+{
+    return a == b.get(); 
+}
+
+template<typename T, typename U> inline bool operator!=(const PassWeak<T>& a, const PassWeak<U>& b) 
+{
+    return a.get() != b.get(); 
+}
+
+template<typename T, typename U> inline bool operator!=(const PassWeak<T>& a, const Weak<U>& b) 
+{
+    return a.get() != b.get(); 
+}
+
+template<typename T, typename U> inline bool operator!=(const Weak<T>& a, const PassWeak<U>& b) 
+{
+    return a.get() != b.get(); 
+}
+
+template<typename T, typename U> inline bool operator!=(const PassWeak<T>& a, U* b)
+{
+    return a.get() != b; 
+}
+
+template<typename T, typename U> inline bool operator!=(T* a, const PassWeak<U>& b) 
+{
+    return a != b.get(); 
+}
+
+} // namespace JSC
+
+#endif // PassWeak_h

Modified: trunk/Source/_javascript_Core/heap/Weak.h (108009 => 108010)


--- trunk/Source/_javascript_Core/heap/Weak.h	2012-02-17 01:43:50 UTC (rev 108009)
+++ trunk/Source/_javascript_Core/heap/Weak.h	2012-02-17 01:56:13 UTC (rev 108010)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2009 Apple Inc. All rights reserved.
+ * Copyright (C) 2009, 2012 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -30,11 +30,14 @@
 #include "Handle.h"
 #include "HandleHeap.h"
 #include "JSGlobalData.h"
+#include "PassWeak.h"
 
 namespace JSC {
 
 // A weakly referenced handle that becomes 0 when the value it points to is garbage collected.
 template <typename T> class Weak : public Handle<T> {
+    WTF_MAKE_NONCOPYABLE(Weak);
+
     using Handle<T>::slot;
     using Handle<T>::setSlot;
 
@@ -46,11 +49,18 @@
     {
     }
 
-    Weak(JSGlobalData& globalData, ExternalType value = ExternalType(), WeakHandleOwner* weakOwner = 0, void* context = 0)
+    Weak(std::nullptr_t)
+        : Handle<T>()
+    {
+    }
+
+    Weak(JSGlobalData& globalData, ExternalType externalType = ExternalType(), WeakHandleOwner* weakOwner = 0, void* context = 0)
         : Handle<T>(globalData.heap.handleHeap()->allocate())
     {
         HandleHeap::heapFor(slot())->makeWeak(slot(), weakOwner, context);
-        set(value);
+        JSValue value = HandleTypes<T>::toJSValue(externalType);
+        HandleHeap::heapFor(slot())->writeBarrier(slot(), value);
+        *slot() = value;
     }
 
     enum AdoptTag { Adopt };
@@ -59,23 +69,7 @@
     {
         validateCell(get());
     }
-    
-    Weak(const Weak& other)
-        : Handle<T>()
-    {
-        if (!other.slot())
-            return;
-        setSlot(HandleHeap::heapFor(other.slot())->copyWeak(other.slot()));
-    }
 
-    template <typename U> Weak(const Weak<U>& other)
-        : Handle<T>()
-    {
-        if (!other.slot())
-            return;
-        setSlot(HandleHeap::heapFor(other.slot())->copyWeak(other.slot()));
-    }
-    
     enum HashTableDeletedValueTag { HashTableDeletedValue };
     bool isHashTableDeletedValue() const { return slot() == hashTableDeletedValue(); }
     Weak(HashTableDeletedValueTag)
@@ -83,6 +77,11 @@
     {
     }
 
+    template<typename U> Weak(const PassWeak<U>& other)
+        : Handle<T>(other.leakHandle())
+    {
+    }
+
     ~Weak()
     {
         clear();
@@ -93,8 +92,12 @@
         Handle<T>::swap(other);
     }
 
+    Weak& operator=(const PassWeak<T>&);
+
     ExternalType get() const { return  HandleTypes<T>::getFromSlot(slot()); }
     
+    PassWeak<T> release() { PassWeak<T> tmp = adoptWeak<T>(slot()); setSlot(0); return tmp; }
+
     void clear()
     {
         if (!slot())
@@ -103,32 +106,6 @@
         setSlot(0);
     }
     
-    void set(JSGlobalData& globalData, ExternalType value, WeakHandleOwner* weakOwner = 0, void* context = 0)
-    {
-        if (!slot()) {
-            setSlot(globalData.heap.handleHeap()->allocate());
-            HandleHeap::heapFor(slot())->makeWeak(slot(), weakOwner, context);
-        }
-        ASSERT(HandleHeap::heapFor(slot())->hasWeakOwner(slot(), weakOwner));
-        set(value);
-    }
-
-    template <typename U> Weak& operator=(const Weak<U>& other)
-    {
-        clear();
-        if (other.slot())
-            setSlot(HandleHeap::heapFor(other.slot())->copyWeak(other.slot()));
-        return *this;
-    }
-
-    Weak& operator=(const Weak& other)
-    {
-        clear();
-        if (other.slot())
-            setSlot(HandleHeap::heapFor(other.slot())->copyWeak(other.slot()));
-        return *this;
-    }
-    
     HandleSlot leakHandle()
     {
         ASSERT(HandleHeap::heapFor(slot())->hasFinalizer(slot()));
@@ -139,14 +116,6 @@
 
 private:
     static HandleSlot hashTableDeletedValue() { return reinterpret_cast<HandleSlot>(-1); }
-
-    void set(ExternalType externalType)
-    {
-        ASSERT(slot());
-        JSValue value = HandleTypes<T>::toJSValue(externalType);
-        HandleHeap::heapFor(slot())->writeBarrier(slot(), value);
-        *slot() = value;
-    }
 };
 
 template<class T> inline void swap(Weak<T>& a, Weak<T>& b)
@@ -154,6 +123,13 @@
     a.swap(b);
 }
 
+template<typename T> inline Weak<T>& Weak<T>::operator=(const PassWeak<T>& o)
+{
+    clear();
+    setSlot(o.leakHandle());
+    return *this;
+}
+
 } // namespace JSC
 
 namespace WTF {
@@ -162,8 +138,24 @@
     static const bool canCompareWithMemcmp = false;
 };
 
-template<typename P> struct HashTraits<JSC::Weak<P> > : SimpleClassHashTraits<JSC::Weak<P> > { };
+template<typename T> struct HashTraits<JSC::Weak<T> > : SimpleClassHashTraits<JSC::Weak<T> > {
+    typedef JSC::Weak<T> StorageType;
 
+    typedef std::nullptr_t EmptyValueType;
+    static EmptyValueType emptyValue() { return EmptyValueType(); }
+
+    typedef JSC::PassWeak<T> PassInType;
+    static void store(PassInType value, StorageType& storage) { storage = value; }
+
+    typedef JSC::PassWeak<T> PassOutType;
+    static PassOutType passOut(StorageType& value) { return value.release(); }
+    static PassOutType passOut(EmptyValueType) { return PassOutType(); }
+
+    typedef typename StorageType::ExternalType PeekType;
+    static PeekType peek(const StorageType& value) { return value.get(); }
+    static PeekType peek(EmptyValueType) { return PeekType(); }
+};
+
 }
 
 #endif // Weak_h

Modified: trunk/Source/_javascript_Core/jit/JITStubs.cpp (108009 => 108010)


--- trunk/Source/_javascript_Core/jit/JITStubs.cpp	2012-02-17 01:43:50 UTC (rev 108009)
+++ trunk/Source/_javascript_Core/jit/JITStubs.cpp	2012-02-17 01:56:13 UTC (rev 108010)
@@ -3600,15 +3600,15 @@
 
 NativeExecutable* JITThunks::hostFunctionStub(JSGlobalData* globalData, NativeFunction function, NativeFunction constructor)
 {
-    std::pair<HostFunctionStubMap::iterator, bool> entry = m_hostFunctionStubMap->add(function, Weak<NativeExecutable>());
-    if (!*entry.first->second)
-        entry.first->second.set(*globalData, NativeExecutable::create(*globalData, JIT::compileCTINativeCall(globalData, function), function, MacroAssemblerCodeRef::createSelfManagedCodeRef(ctiNativeConstruct()), constructor, NoIntrinsic));
-    return entry.first->second.get();
+    std::pair<HostFunctionStubMap::iterator, bool> result = m_hostFunctionStubMap->add(function, PassWeak<NativeExecutable>());
+    if (!result.first->second)
+        result.first->second = PassWeak<NativeExecutable>(*globalData, NativeExecutable::create(*globalData, JIT::compileCTINativeCall(globalData, function), function, MacroAssemblerCodeRef::createSelfManagedCodeRef(ctiNativeConstruct()), constructor, NoIntrinsic));
+    return result.first->second.get();
 }
 
 NativeExecutable* JITThunks::hostFunctionStub(JSGlobalData* globalData, NativeFunction function, ThunkGenerator generator, Intrinsic intrinsic)
 {
-    std::pair<HostFunctionStubMap::iterator, bool> entry = m_hostFunctionStubMap->add(function, Weak<NativeExecutable>());
+    std::pair<HostFunctionStubMap::iterator, bool> entry = m_hostFunctionStubMap->add(function, PassWeak<NativeExecutable>());
     if (!*entry.first->second) {
         MacroAssemblerCodeRef code;
         if (generator) {
@@ -3618,7 +3618,7 @@
                 code = MacroAssemblerCodeRef();
         } else
             code = JIT::compileCTINativeCall(globalData, function);
-        entry.first->second.set(*globalData, NativeExecutable::create(*globalData, code, function, MacroAssemblerCodeRef::createSelfManagedCodeRef(ctiNativeConstruct()), callHostFunctionAsConstructor, intrinsic));
+        entry.first->second = PassWeak<NativeExecutable>(*globalData, NativeExecutable::create(*globalData, code, function, MacroAssemblerCodeRef::createSelfManagedCodeRef(ctiNativeConstruct()), callHostFunctionAsConstructor, intrinsic));
     }
     return entry.first->second.get();
 }

Modified: trunk/Source/_javascript_Core/runtime/RegExpCache.cpp (108009 => 108010)


--- trunk/Source/_javascript_Core/runtime/RegExpCache.cpp	2012-02-17 01:43:50 UTC (rev 108009)
+++ trunk/Source/_javascript_Core/runtime/RegExpCache.cpp	2012-02-17 01:56:13 UTC (rev 108010)
@@ -46,7 +46,7 @@
     // We need to do a second lookup to add the RegExp as
     // allocating it may have caused a gc cycle, which in
     // turn may have removed items from the cache.
-    m_weakCache.add(key, Weak<RegExp>(*m_globalData, regExp, this));
+    m_weakCache.add(key, PassWeak<RegExp>(*m_globalData, regExp, this));
     return regExp;
 }
 

Modified: trunk/Source/WebCore/ChangeLog (108009 => 108010)


--- trunk/Source/WebCore/ChangeLog	2012-02-17 01:43:50 UTC (rev 108009)
+++ trunk/Source/WebCore/ChangeLog	2012-02-17 01:56:13 UTC (rev 108010)
@@ -1,3 +1,29 @@
+2012-02-15  Geoffrey Garen  <[email protected]>
+
+        Made Weak<T> single-owner, adding PassWeak<T>
+        https://bugs.webkit.org/show_bug.cgi?id=78740
+
+        Reviewed by Sam Weinig.
+
+        * bindings/js/JSDOMBinding.cpp:
+        (WebCore::jsStringSlowCase): Use PassWeak<T>, as required by our new
+        hash map API.
+
+        * bindings/js/JSDOMBinding.h:
+        (WebCore::getCachedWrapper):
+        (WebCore::cacheWrapper): Use PassWeak<T> and raw pointer, as required by
+        our new hash map API.
+
+        * bindings/js/JSEventListener.h:
+        (WebCore::JSEventListener::setWrapper):
+        * bindings/js/ScriptWrappable.h:
+        (WebCore::ScriptWrappable::setWrapper):
+        * bridge/jsc/BridgeJSC.cpp:
+        (JSC::Bindings::Instance::createRuntimeObject):
+        * bridge/runtime_root.cpp:
+        (JSC::Bindings::RootObject::addRuntimeObject): Use PassWeak<T>, as
+        required by our new hash map and Weak<T> APIs.
+
 2012-02-16  Ryosuke Niwa  <[email protected]>
 
         Crash in visiblePositionForIndex
@@ -2119,6 +2145,7 @@
         * platform/ScrollView.h:
         Move wheelEvent to FrameView.
 
+>>>>>>> .r108008
 2012-02-15  Mark Hahnenberg  <[email protected]>
 
         RootObject::finalize can cause a crash in object->invalidate()
@@ -7640,7 +7667,6 @@
         (WebCore::RenderStyle::getRoundedBorderFor):
         (WebCore::RenderStyle::getRoundedInnerBorderFor):
 
-<<<<<<< .mine
 2012-02-09  Levi Weintraub  <[email protected]>
 
         Add pixelSnappedIntRect method

Modified: trunk/Source/WebCore/bindings/js/JSDOMBinding.cpp (108009 => 108010)


--- trunk/Source/WebCore/bindings/js/JSDOMBinding.cpp	2012-02-17 01:43:50 UTC (rev 108009)
+++ trunk/Source/WebCore/bindings/js/JSDOMBinding.cpp	2012-02-17 01:56:13 UTC (rev 108010)
@@ -49,7 +49,7 @@
 JSValue jsStringSlowCase(ExecState* exec, JSStringCache& stringCache, StringImpl* stringImpl)
 {
     JSString* wrapper = jsString(exec, UString(stringImpl));
-    stringCache.add(stringImpl, Weak<JSString>(exec->globalData(), wrapper, currentWorld(exec)->stringWrapperOwner(), stringImpl));
+    stringCache.add(stringImpl, PassWeak<JSString>(exec->globalData(), wrapper, currentWorld(exec)->stringWrapperOwner(), stringImpl));
     return wrapper;
 }
 

Modified: trunk/Source/WebCore/bindings/js/JSDOMBinding.h (108009 => 108010)


--- trunk/Source/WebCore/bindings/js/JSDOMBinding.h	2012-02-17 01:43:50 UTC (rev 108009)
+++ trunk/Source/WebCore/bindings/js/JSDOMBinding.h	2012-02-17 01:56:13 UTC (rev 108010)
@@ -132,17 +132,16 @@
     {
         if (JSDOMWrapper* wrapper = getInlineCachedWrapper(world, domObject))
             return wrapper;
-        return world->m_wrappers.get(domObject).get();
+        return world->m_wrappers.get(domObject);
     }
 
     template <typename DOMClass> inline void cacheWrapper(DOMWrapperWorld* world, DOMClass* domObject, JSDOMWrapper* wrapper)
     {
         if (setInlineCachedWrapper(world, domObject, wrapper))
             return;
-        pair<DOMObjectWrapperMap::iterator, bool> entry = world->m_wrappers.add(domObject, JSC::Weak<JSDOMWrapper>());
-        ASSERT(entry.second);
-        JSC::Weak<JSDOMWrapper> handle(*world->globalData(), wrapper, wrapperOwner(world, domObject), wrapperContext(world, domObject));
-        entry.first->second.swap(handle);
+        JSC::PassWeak<JSDOMWrapper> passWeak(*world->globalData(), wrapper, wrapperOwner(world, domObject), wrapperContext(world, domObject));
+        pair<DOMObjectWrapperMap::iterator, bool> result = world->m_wrappers.add(domObject, passWeak);
+        ASSERT_UNUSED(result, result.second);
     }
 
     template <typename DOMClass> inline void uncacheWrapper(DOMWrapperWorld* world, DOMClass* domObject, JSDOMWrapper* wrapper)

Modified: trunk/Source/WebCore/bindings/js/JSEventListener.h (108009 => 108010)


--- trunk/Source/WebCore/bindings/js/JSEventListener.h	2012-02-17 01:43:50 UTC (rev 108009)
+++ trunk/Source/WebCore/bindings/js/JSEventListener.h	2012-02-17 01:56:13 UTC (rev 108010)
@@ -53,7 +53,7 @@
         DOMWrapperWorld* isolatedWorld() const { return m_isolatedWorld.get(); }
 
         JSC::JSObject* wrapper() const { return m_wrapper.get(); }
-        void setWrapper(JSC::JSGlobalData& globalData, JSC::JSObject* wrapper) const { m_wrapper.set(globalData, wrapper, 0); }
+        void setWrapper(JSC::JSGlobalData& globalData, JSC::JSObject* wrapper) const { m_wrapper = JSC::PassWeak<JSC::JSObject>(globalData, wrapper, 0); }
 
     private:
         virtual JSC::JSObject* initializeJSFunction(ScriptExecutionContext*) const;

Modified: trunk/Source/WebCore/bindings/js/ScriptWrappable.h (108009 => 108010)


--- trunk/Source/WebCore/bindings/js/ScriptWrappable.h	2012-02-17 01:43:50 UTC (rev 108009)
+++ trunk/Source/WebCore/bindings/js/ScriptWrappable.h	2012-02-17 01:56:13 UTC (rev 108010)
@@ -45,7 +45,7 @@
 
     void setWrapper(JSC::JSGlobalData& globalData, JSDOMWrapper* wrapper, JSC::WeakHandleOwner* wrapperOwner, void* context)
     {
-        m_wrapper.set(globalData, wrapper, wrapperOwner, context);
+        m_wrapper = JSC::PassWeak<JSDOMWrapper>(globalData, wrapper, wrapperOwner, context);
     }
 
     void clearWrapper()

Modified: trunk/Source/WebCore/bridge/jsc/BridgeJSC.cpp (108009 => 108010)


--- trunk/Source/WebCore/bridge/jsc/BridgeJSC.cpp	2012-02-17 01:43:50 UTC (rev 108009)
+++ trunk/Source/WebCore/bridge/jsc/BridgeJSC.cpp	2012-02-17 01:56:13 UTC (rev 108010)
@@ -95,7 +95,7 @@
 
     JSLock lock(SilenceAssertionsOnly);
     RuntimeObject* newObject = newRuntimeObject(exec);
-    m_runtimeObject.set(exec->globalData(), newObject, 0);
+    m_runtimeObject = PassWeak<RuntimeObject>(exec->globalData(), newObject);
     m_rootObject->addRuntimeObject(exec->globalData(), newObject);
     return newObject;
 }

Modified: trunk/Source/WebCore/bridge/qt/qt_runtime.cpp (108009 => 108010)


--- trunk/Source/WebCore/bridge/qt/qt_runtime.cpp	2012-02-17 01:43:50 UTC (rev 108009)
+++ trunk/Source/WebCore/bridge/qt/qt_runtime.cpp	2012-02-17 01:56:13 UTC (rev 108010)
@@ -972,7 +972,7 @@
     Base::finishCreation(exec->globalData(), identifier);
     QW_D(QtRuntimeMethod);
     d->m_instance = instance;
-    d->m_finalizer.set(exec->globalData(), this, d);
+    d->m_finalizer = PassWeak<QtRuntimeMethod>(exec->globalData(), this, d);
 }
 
 QtRuntimeMethod::~QtRuntimeMethod()

Modified: trunk/Source/WebCore/bridge/runtime_root.cpp (108009 => 108010)


--- trunk/Source/WebCore/bridge/runtime_root.cpp	2012-02-17 01:43:50 UTC (rev 108009)
+++ trunk/Source/WebCore/bridge/runtime_root.cpp	2012-02-17 01:56:13 UTC (rev 108010)
@@ -181,7 +181,7 @@
     ASSERT(m_isValid);
     ASSERT(!m_runtimeObjects.get(object));
 
-    m_runtimeObjects.set(object, JSC::Weak<RuntimeObject>(globalData, object, this));
+    m_runtimeObjects.set(object, JSC::PassWeak<RuntimeObject>(globalData, object, this));
 }
 
 void RootObject::removeRuntimeObject(RuntimeObject* object)

Modified: trunk/Source/WebKit2/ChangeLog (108009 => 108010)


--- trunk/Source/WebKit2/ChangeLog	2012-02-17 01:43:50 UTC (rev 108009)
+++ trunk/Source/WebKit2/ChangeLog	2012-02-17 01:56:13 UTC (rev 108010)
@@ -1,3 +1,14 @@
+2012-02-15  Geoffrey Garen  <[email protected]>
+
+        Made Weak<T> single-owner, adding PassWeak<T>
+        https://bugs.webkit.org/show_bug.cgi?id=78740
+
+        Reviewed by Sam Weinig.
+
+        * WebProcess/Plugins/Netscape/NPRuntimeObjectMap.cpp:
+        (WebKit::NPRuntimeObjectMap::getOrCreateJSObject): Use raw pointer and
+        PassWeak<T>, as required by our new hash map API.
+
 2012-02-16  Sergio Villar Senin  <[email protected]>
 
         [soup] Move important SoupSession feature initialization to WebCore

Modified: trunk/Source/WebKit2/WebProcess/Plugins/Netscape/NPRuntimeObjectMap.cpp (108009 => 108010)


--- trunk/Source/WebKit2/WebProcess/Plugins/Netscape/NPRuntimeObjectMap.cpp	2012-02-17 01:43:50 UTC (rev 108009)
+++ trunk/Source/WebKit2/WebProcess/Plugins/Netscape/NPRuntimeObjectMap.cpp	2012-02-17 01:56:13 UTC (rev 108010)
@@ -98,11 +98,11 @@
     if (NPJSObject::isNPJSObject(npObject))
         return NPJSObject::toNPJSObject(npObject)->jsObject();
     
-    if (JSC::Weak<JSNPObject> jsNPObject = m_jsNPObjects.get(npObject))
-        return jsNPObject.get();
+    if (JSNPObject* jsNPObject = m_jsNPObjects.get(npObject))
+        return jsNPObject;
 
     JSNPObject* jsNPObject = JSNPObject::create(globalObject, this, npObject);
-    m_jsNPObjects.set(npObject, JSC::Weak<JSNPObject>(globalObject->globalData(), jsNPObject, this, npObject));
+    m_jsNPObjects.set(npObject, JSC::PassWeak<JSNPObject>(globalObject->globalData(), jsNPObject, this, npObject));
 
     return jsNPObject;
 }
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to