Title: [280414] trunk
Revision
280414
Author
[email protected]
Date
2021-07-28 19:33:05 -0700 (Wed, 28 Jul 2021)

Log Message

makeWeakPtr should support Ref and RefPtr as the argument
https://bugs.webkit.org/show_bug.cgi?id=228574

Reviewed by Wenson Hsieh.

Source/WTF:

This patch adds variants of makeWeakPtr<T> which take Ref<T> and RefPtr<T>.

Tests: TestWebKitAPI.WTF_WeakPtr.MakeWeakPtrTakesRef
       TestWebKitAPI.WTF_WeakPtr.MakeWeakPtrTakesRefPtr

* wtf/WeakPtr.h:
(WTF::makeWeakPtr):

Tools:

Added unit tests for makeWeakPtr<T> on Ref<T> and RefPtr<T>.

* TestWebKitAPI/Tests/WTF/WeakPtr.cpp:
(TestWebKitAPI::BaseObjectWithRefAndWeakPtr): Added.
(TestWebKitAPI::BaseObjectWithRefAndWeakPtr::create): Added.
(TestWebKitAPI::BaseObjectWithRefAndWeakPtr::someFunction):
(TestWebKitAPI::DerivedObjectWithRefAndWeakPtr): Added.
(TestWebKitAPI::DerivedObjectWithRefAndWeakPtr::create):
(WTF_WeakPtr.MakeWeakPtrTakesRef): Added.
(WTF_WeakPtr.MakeWeakPtrTakesRefPtr): Added.

Modified Paths

Diff

Modified: trunk/Source/WTF/ChangeLog (280413 => 280414)


--- trunk/Source/WTF/ChangeLog	2021-07-29 02:31:53 UTC (rev 280413)
+++ trunk/Source/WTF/ChangeLog	2021-07-29 02:33:05 UTC (rev 280414)
@@ -1,3 +1,18 @@
+2021-07-28  Ryosuke Niwa  <[email protected]>
+
+        makeWeakPtr should support Ref and RefPtr as the argument
+        https://bugs.webkit.org/show_bug.cgi?id=228574
+
+        Reviewed by Wenson Hsieh.
+
+        This patch adds variants of makeWeakPtr<T> which take Ref<T> and RefPtr<T>.
+
+        Tests: TestWebKitAPI.WTF_WeakPtr.MakeWeakPtrTakesRef
+               TestWebKitAPI.WTF_WeakPtr.MakeWeakPtrTakesRefPtr
+
+        * wtf/WeakPtr.h:
+        (WTF::makeWeakPtr):
+
 2021-07-28  Myles C. Maxfield  <[email protected]>
 
         [Cocoa] macOS Monterey and parallel OSes no longer need r280103

Modified: trunk/Source/WTF/wtf/WeakPtr.h (280413 => 280414)


--- trunk/Source/WTF/wtf/WeakPtr.h	2021-07-29 02:31:53 UTC (rev 280413)
+++ trunk/Source/WTF/wtf/WeakPtr.h	2021-07-29 02:33:05 UTC (rev 280414)
@@ -266,12 +266,12 @@
     return *this;
 }
 
-template<typename T> inline auto makeWeakPtr(T& object, EnableWeakPtrThreadingAssertions enableWeakPtrThreadingAssertions = EnableWeakPtrThreadingAssertions::Yes)
+template<typename T, typename = std::enable_if_t<!IsSmartPtr<T>::value>> inline auto makeWeakPtr(T& object, EnableWeakPtrThreadingAssertions enableWeakPtrThreadingAssertions = EnableWeakPtrThreadingAssertions::Yes)
 {
     return object.weakPtrFactory().template createWeakPtr<T>(object, enableWeakPtrThreadingAssertions);
 }
 
-template<typename T> inline auto makeWeakPtr(T* ptr, EnableWeakPtrThreadingAssertions enableWeakPtrThreadingAssertions = EnableWeakPtrThreadingAssertions::Yes) -> decltype(makeWeakPtr(*ptr))
+template<typename T, typename = std::enable_if_t<!IsSmartPtr<T>::value>> inline auto makeWeakPtr(T* ptr, EnableWeakPtrThreadingAssertions enableWeakPtrThreadingAssertions = EnableWeakPtrThreadingAssertions::Yes) -> decltype(makeWeakPtr(*ptr))
 {
     if (!ptr)
         return { };
@@ -278,6 +278,16 @@
     return makeWeakPtr(*ptr, enableWeakPtrThreadingAssertions);
 }
 
+template<typename T, typename = std::enable_if_t<!IsSmartPtr<T>::value>> inline auto makeWeakPtr(const Ref<T>& object, EnableWeakPtrThreadingAssertions enableWeakPtrThreadingAssertions = EnableWeakPtrThreadingAssertions::Yes)
+{
+    return makeWeakPtr(object.get(), enableWeakPtrThreadingAssertions);
+}
+
+template<typename T, typename = std::enable_if_t<!IsSmartPtr<T>::value>> inline auto makeWeakPtr(const RefPtr<T>& object, EnableWeakPtrThreadingAssertions enableWeakPtrThreadingAssertions = EnableWeakPtrThreadingAssertions::Yes)
+{
+    return makeWeakPtr(object.get(), enableWeakPtrThreadingAssertions);
+}
+
 template<typename T, typename U, typename Counter> inline bool operator==(const WeakPtr<T, Counter>& a, const WeakPtr<U, Counter>& b)
 {
     return a.get() == b.get();

Modified: trunk/Tools/ChangeLog (280413 => 280414)


--- trunk/Tools/ChangeLog	2021-07-29 02:31:53 UTC (rev 280413)
+++ trunk/Tools/ChangeLog	2021-07-29 02:33:05 UTC (rev 280414)
@@ -1,3 +1,21 @@
+2021-07-28  Ryosuke Niwa  <[email protected]>
+
+        makeWeakPtr should support Ref and RefPtr as the argument
+        https://bugs.webkit.org/show_bug.cgi?id=228574
+
+        Reviewed by Wenson Hsieh.
+
+        Added unit tests for makeWeakPtr<T> on Ref<T> and RefPtr<T>.
+
+        * TestWebKitAPI/Tests/WTF/WeakPtr.cpp:
+        (TestWebKitAPI::BaseObjectWithRefAndWeakPtr): Added.
+        (TestWebKitAPI::BaseObjectWithRefAndWeakPtr::create): Added.
+        (TestWebKitAPI::BaseObjectWithRefAndWeakPtr::someFunction):
+        (TestWebKitAPI::DerivedObjectWithRefAndWeakPtr): Added.
+        (TestWebKitAPI::DerivedObjectWithRefAndWeakPtr::create):
+        (WTF_WeakPtr.MakeWeakPtrTakesRef): Added.
+        (WTF_WeakPtr.MakeWeakPtrTakesRefPtr): Added.
+
 2021-07-28  Jonathan Bedard  <[email protected]>
 
         [webkitcorepy] Add hybridmethod decorator

Modified: trunk/Tools/TestWebKitAPI/Tests/WTF/WeakPtr.cpp (280413 => 280414)


--- trunk/Tools/TestWebKitAPI/Tests/WTF/WeakPtr.cpp	2021-07-29 02:31:53 UTC (rev 280413)
+++ trunk/Tools/TestWebKitAPI/Tests/WTF/WeakPtr.cpp	2021-07-29 02:33:05 UTC (rev 280414)
@@ -345,6 +345,101 @@
     }
 }
 
+class BaseObjectWithRefAndWeakPtr : public RefCounted<BaseObjectWithRefAndWeakPtr>, public CanMakeWeakPtr<BaseObjectWithRefAndWeakPtr> {
+public:
+    static Ref<BaseObjectWithRefAndWeakPtr> create() { return adoptRef(*new BaseObjectWithRefAndWeakPtr()); }
+
+    virtual ~BaseObjectWithRefAndWeakPtr() = default;
+    void someFunction() { }
+
+protected:
+    BaseObjectWithRefAndWeakPtr() = default;
+};
+
+class DerivedObjectWithRefAndWeakPtr : public BaseObjectWithRefAndWeakPtr {
+public:
+    static Ref<DerivedObjectWithRefAndWeakPtr> create() { return adoptRef(*new DerivedObjectWithRefAndWeakPtr()); }
+
+private:
+    DerivedObjectWithRefAndWeakPtr() = default;
+    virtual ~DerivedObjectWithRefAndWeakPtr() = default;
+};
+
+TEST(WTF_WeakPtr, MakeWeakPtrTakesRef)
+{
+    Ref baseObject = BaseObjectWithRefAndWeakPtr::create();
+    EXPECT_EQ(baseObject->refCount(), 1U);
+    EXPECT_EQ(baseObject->weakPtrFactory().weakPtrCount(), 0U);
+    {
+        auto baseObjectWeakPtr = makeWeakPtr(baseObject);
+        EXPECT_EQ(baseObject->refCount(), 1U);
+        EXPECT_EQ(baseObject->weakPtrFactory().weakPtrCount(), 1U);
+        EXPECT_EQ(baseObjectWeakPtr.get(), baseObject.ptr());
+    }
+    EXPECT_EQ(baseObject->refCount(), 1U);
+    EXPECT_EQ(baseObject->weakPtrFactory().weakPtrCount(), 0U);
+
+    WeakPtr<BaseObjectWithRefAndWeakPtr> baseWeakPtr;
+    {
+        Ref derivedObject = DerivedObjectWithRefAndWeakPtr::create();
+        EXPECT_EQ(derivedObject->refCount(), 1U);
+        EXPECT_EQ(derivedObject->weakPtrFactory().weakPtrCount(), 0U);
+        {
+            WeakPtr<DerivedObjectWithRefAndWeakPtr> derivedObjectWeakPtr = makeWeakPtr(derivedObject);
+            EXPECT_EQ(derivedObject->refCount(), 1U);
+            EXPECT_EQ(derivedObject->weakPtrFactory().weakPtrCount(), 1U);
+            EXPECT_EQ(derivedObjectWeakPtr.get(), derivedObject.ptr());
+        }
+        EXPECT_EQ(derivedObject->refCount(), 1U);
+        EXPECT_EQ(derivedObject->weakPtrFactory().weakPtrCount(), 0U);
+        {
+            Ref<BaseObjectWithRefAndWeakPtr> baseRefPtr = derivedObject;
+            EXPECT_EQ(derivedObject->refCount(), 2U);
+            EXPECT_EQ(derivedObject->weakPtrFactory().weakPtrCount(), 0U);
+            baseWeakPtr = makeWeakPtr(baseRefPtr);
+            EXPECT_EQ(derivedObject->refCount(), 2U);
+            EXPECT_EQ(derivedObject->weakPtrFactory().weakPtrCount(), 1U);
+            EXPECT_EQ(baseWeakPtr.get(), derivedObject.ptr());
+        }
+        EXPECT_EQ(derivedObject->refCount(), 1U);
+        EXPECT_EQ(derivedObject->weakPtrFactory().weakPtrCount(), 1U);
+        EXPECT_EQ(baseWeakPtr.get(), derivedObject.ptr());
+    }
+    EXPECT_EQ(baseWeakPtr.get(), nullptr);
+}
+
+TEST(WTF_WeakPtr, MakeWeakPtrTakesRefPtr)
+{
+    RefPtr<BaseObjectWithRefAndWeakPtr> baseObject = BaseObjectWithRefAndWeakPtr::create();
+    EXPECT_EQ(baseObject->refCount(), 1U);
+    EXPECT_EQ(baseObject->weakPtrFactory().weakPtrCount(), 0U);
+    {
+        auto baseObjectWeakPtr = makeWeakPtr(baseObject);
+        EXPECT_EQ(baseObject->refCount(), 1U);
+        EXPECT_EQ(baseObject->weakPtrFactory().weakPtrCount(), 1U);
+        EXPECT_EQ(baseObjectWeakPtr.get(), baseObject.get());
+        baseObject = nullptr;
+        EXPECT_EQ(baseObjectWeakPtr.get(), nullptr);
+    }
+
+    RefPtr<DerivedObjectWithRefAndWeakPtr> derivedObject = DerivedObjectWithRefAndWeakPtr::create();
+    EXPECT_EQ(derivedObject->refCount(), 1U);
+    EXPECT_EQ(derivedObject->weakPtrFactory().weakPtrCount(), 0U);
+    {
+        WeakPtr<DerivedObjectWithRefAndWeakPtr> derivedObjectWeakPtr = makeWeakPtr(derivedObject);
+        EXPECT_EQ(derivedObject->refCount(), 1U);
+        EXPECT_EQ(derivedObject->weakPtrFactory().weakPtrCount(), 1U);
+        EXPECT_EQ(derivedObjectWeakPtr.get(), derivedObject.get());
+
+        WeakPtr<BaseObjectWithRefAndWeakPtr> baseObjectWeakPtr = makeWeakPtr<BaseObjectWithRefAndWeakPtr>(derivedObject);
+        EXPECT_EQ(derivedObject->refCount(), 1U);
+        EXPECT_EQ(derivedObject->weakPtrFactory().weakPtrCount(), 2U);
+        EXPECT_EQ(baseObjectWeakPtr.get(), derivedObject.get());
+    }
+    EXPECT_EQ(derivedObject->refCount(), 1U);
+    EXPECT_EQ(derivedObject->weakPtrFactory().weakPtrCount(), 0U);
+}
+
 template <typename T>
 unsigned computeSizeOfWeakHashSet(const WeakHashSet<T>& set)
 {
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to