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)
{