Skip to content

Commit 4b00bd3

Browse files
committed
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. Canonical link: https://commits.webkit.org/240054@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@280414 268f45cc-cd09-0410-ab3c-d52691b4dbfc
1 parent 62f8121 commit 4b00bd3

4 files changed

Lines changed: 140 additions & 2 deletions

File tree

Source/WTF/ChangeLog

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,18 @@
1+
2021-07-28 Ryosuke Niwa <rniwa@webkit.org>
2+
3+
makeWeakPtr should support Ref and RefPtr as the argument
4+
https://bugs.webkit.org/show_bug.cgi?id=228574
5+
6+
Reviewed by Wenson Hsieh.
7+
8+
This patch adds variants of makeWeakPtr<T> which take Ref<T> and RefPtr<T>.
9+
10+
Tests: TestWebKitAPI.WTF_WeakPtr.MakeWeakPtrTakesRef
11+
TestWebKitAPI.WTF_WeakPtr.MakeWeakPtrTakesRefPtr
12+
13+
* wtf/WeakPtr.h:
14+
(WTF::makeWeakPtr):
15+
116
2021-07-28 Myles C. Maxfield <mmaxfield@apple.com>
217

318
[Cocoa] macOS Monterey and parallel OSes no longer need r280103

Source/WTF/wtf/WeakPtr.h

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -266,18 +266,28 @@ template<typename T, typename Counter> template<typename U> inline WeakPtr<T, Co
266266
return *this;
267267
}
268268

269-
template<typename T> inline auto makeWeakPtr(T& object, EnableWeakPtrThreadingAssertions enableWeakPtrThreadingAssertions = EnableWeakPtrThreadingAssertions::Yes)
269+
template<typename T, typename = std::enable_if_t<!IsSmartPtr<T>::value>> inline auto makeWeakPtr(T& object, EnableWeakPtrThreadingAssertions enableWeakPtrThreadingAssertions = EnableWeakPtrThreadingAssertions::Yes)
270270
{
271271
return object.weakPtrFactory().template createWeakPtr<T>(object, enableWeakPtrThreadingAssertions);
272272
}
273273

274-
template<typename T> inline auto makeWeakPtr(T* ptr, EnableWeakPtrThreadingAssertions enableWeakPtrThreadingAssertions = EnableWeakPtrThreadingAssertions::Yes) -> decltype(makeWeakPtr(*ptr))
274+
template<typename T, typename = std::enable_if_t<!IsSmartPtr<T>::value>> inline auto makeWeakPtr(T* ptr, EnableWeakPtrThreadingAssertions enableWeakPtrThreadingAssertions = EnableWeakPtrThreadingAssertions::Yes) -> decltype(makeWeakPtr(*ptr))
275275
{
276276
if (!ptr)
277277
return { };
278278
return makeWeakPtr(*ptr, enableWeakPtrThreadingAssertions);
279279
}
280280

281+
template<typename T, typename = std::enable_if_t<!IsSmartPtr<T>::value>> inline auto makeWeakPtr(const Ref<T>& object, EnableWeakPtrThreadingAssertions enableWeakPtrThreadingAssertions = EnableWeakPtrThreadingAssertions::Yes)
282+
{
283+
return makeWeakPtr(object.get(), enableWeakPtrThreadingAssertions);
284+
}
285+
286+
template<typename T, typename = std::enable_if_t<!IsSmartPtr<T>::value>> inline auto makeWeakPtr(const RefPtr<T>& object, EnableWeakPtrThreadingAssertions enableWeakPtrThreadingAssertions = EnableWeakPtrThreadingAssertions::Yes)
287+
{
288+
return makeWeakPtr(object.get(), enableWeakPtrThreadingAssertions);
289+
}
290+
281291
template<typename T, typename U, typename Counter> inline bool operator==(const WeakPtr<T, Counter>& a, const WeakPtr<U, Counter>& b)
282292
{
283293
return a.get() == b.get();

Tools/ChangeLog

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,21 @@
1+
2021-07-28 Ryosuke Niwa <rniwa@webkit.org>
2+
3+
makeWeakPtr should support Ref and RefPtr as the argument
4+
https://bugs.webkit.org/show_bug.cgi?id=228574
5+
6+
Reviewed by Wenson Hsieh.
7+
8+
Added unit tests for makeWeakPtr<T> on Ref<T> and RefPtr<T>.
9+
10+
* TestWebKitAPI/Tests/WTF/WeakPtr.cpp:
11+
(TestWebKitAPI::BaseObjectWithRefAndWeakPtr): Added.
12+
(TestWebKitAPI::BaseObjectWithRefAndWeakPtr::create): Added.
13+
(TestWebKitAPI::BaseObjectWithRefAndWeakPtr::someFunction):
14+
(TestWebKitAPI::DerivedObjectWithRefAndWeakPtr): Added.
15+
(TestWebKitAPI::DerivedObjectWithRefAndWeakPtr::create):
16+
(WTF_WeakPtr.MakeWeakPtrTakesRef): Added.
17+
(WTF_WeakPtr.MakeWeakPtrTakesRefPtr): Added.
18+
119
2021-07-28 Jonathan Bedard <jbedard@apple.com>
220

321
[webkitcorepy] Add hybridmethod decorator

Tools/TestWebKitAPI/Tests/WTF/WeakPtr.cpp

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -345,6 +345,101 @@ TEST(WTF_WeakPtr, DerivedConstructAndAssignConst)
345345
}
346346
}
347347

348+
class BaseObjectWithRefAndWeakPtr : public RefCounted<BaseObjectWithRefAndWeakPtr>, public CanMakeWeakPtr<BaseObjectWithRefAndWeakPtr> {
349+
public:
350+
static Ref<BaseObjectWithRefAndWeakPtr> create() { return adoptRef(*new BaseObjectWithRefAndWeakPtr()); }
351+
352+
virtual ~BaseObjectWithRefAndWeakPtr() = default;
353+
void someFunction() { }
354+
355+
protected:
356+
BaseObjectWithRefAndWeakPtr() = default;
357+
};
358+
359+
class DerivedObjectWithRefAndWeakPtr : public BaseObjectWithRefAndWeakPtr {
360+
public:
361+
static Ref<DerivedObjectWithRefAndWeakPtr> create() { return adoptRef(*new DerivedObjectWithRefAndWeakPtr()); }
362+
363+
private:
364+
DerivedObjectWithRefAndWeakPtr() = default;
365+
virtual ~DerivedObjectWithRefAndWeakPtr() = default;
366+
};
367+
368+
TEST(WTF_WeakPtr, MakeWeakPtrTakesRef)
369+
{
370+
Ref baseObject = BaseObjectWithRefAndWeakPtr::create();
371+
EXPECT_EQ(baseObject->refCount(), 1U);
372+
EXPECT_EQ(baseObject->weakPtrFactory().weakPtrCount(), 0U);
373+
{
374+
auto baseObjectWeakPtr = makeWeakPtr(baseObject);
375+
EXPECT_EQ(baseObject->refCount(), 1U);
376+
EXPECT_EQ(baseObject->weakPtrFactory().weakPtrCount(), 1U);
377+
EXPECT_EQ(baseObjectWeakPtr.get(), baseObject.ptr());
378+
}
379+
EXPECT_EQ(baseObject->refCount(), 1U);
380+
EXPECT_EQ(baseObject->weakPtrFactory().weakPtrCount(), 0U);
381+
382+
WeakPtr<BaseObjectWithRefAndWeakPtr> baseWeakPtr;
383+
{
384+
Ref derivedObject = DerivedObjectWithRefAndWeakPtr::create();
385+
EXPECT_EQ(derivedObject->refCount(), 1U);
386+
EXPECT_EQ(derivedObject->weakPtrFactory().weakPtrCount(), 0U);
387+
{
388+
WeakPtr<DerivedObjectWithRefAndWeakPtr> derivedObjectWeakPtr = makeWeakPtr(derivedObject);
389+
EXPECT_EQ(derivedObject->refCount(), 1U);
390+
EXPECT_EQ(derivedObject->weakPtrFactory().weakPtrCount(), 1U);
391+
EXPECT_EQ(derivedObjectWeakPtr.get(), derivedObject.ptr());
392+
}
393+
EXPECT_EQ(derivedObject->refCount(), 1U);
394+
EXPECT_EQ(derivedObject->weakPtrFactory().weakPtrCount(), 0U);
395+
{
396+
Ref<BaseObjectWithRefAndWeakPtr> baseRefPtr = derivedObject;
397+
EXPECT_EQ(derivedObject->refCount(), 2U);
398+
EXPECT_EQ(derivedObject->weakPtrFactory().weakPtrCount(), 0U);
399+
baseWeakPtr = makeWeakPtr(baseRefPtr);
400+
EXPECT_EQ(derivedObject->refCount(), 2U);
401+
EXPECT_EQ(derivedObject->weakPtrFactory().weakPtrCount(), 1U);
402+
EXPECT_EQ(baseWeakPtr.get(), derivedObject.ptr());
403+
}
404+
EXPECT_EQ(derivedObject->refCount(), 1U);
405+
EXPECT_EQ(derivedObject->weakPtrFactory().weakPtrCount(), 1U);
406+
EXPECT_EQ(baseWeakPtr.get(), derivedObject.ptr());
407+
}
408+
EXPECT_EQ(baseWeakPtr.get(), nullptr);
409+
}
410+
411+
TEST(WTF_WeakPtr, MakeWeakPtrTakesRefPtr)
412+
{
413+
RefPtr<BaseObjectWithRefAndWeakPtr> baseObject = BaseObjectWithRefAndWeakPtr::create();
414+
EXPECT_EQ(baseObject->refCount(), 1U);
415+
EXPECT_EQ(baseObject->weakPtrFactory().weakPtrCount(), 0U);
416+
{
417+
auto baseObjectWeakPtr = makeWeakPtr(baseObject);
418+
EXPECT_EQ(baseObject->refCount(), 1U);
419+
EXPECT_EQ(baseObject->weakPtrFactory().weakPtrCount(), 1U);
420+
EXPECT_EQ(baseObjectWeakPtr.get(), baseObject.get());
421+
baseObject = nullptr;
422+
EXPECT_EQ(baseObjectWeakPtr.get(), nullptr);
423+
}
424+
425+
RefPtr<DerivedObjectWithRefAndWeakPtr> derivedObject = DerivedObjectWithRefAndWeakPtr::create();
426+
EXPECT_EQ(derivedObject->refCount(), 1U);
427+
EXPECT_EQ(derivedObject->weakPtrFactory().weakPtrCount(), 0U);
428+
{
429+
WeakPtr<DerivedObjectWithRefAndWeakPtr> derivedObjectWeakPtr = makeWeakPtr(derivedObject);
430+
EXPECT_EQ(derivedObject->refCount(), 1U);
431+
EXPECT_EQ(derivedObject->weakPtrFactory().weakPtrCount(), 1U);
432+
EXPECT_EQ(derivedObjectWeakPtr.get(), derivedObject.get());
433+
434+
WeakPtr<BaseObjectWithRefAndWeakPtr> baseObjectWeakPtr = makeWeakPtr<BaseObjectWithRefAndWeakPtr>(derivedObject);
435+
EXPECT_EQ(derivedObject->refCount(), 1U);
436+
EXPECT_EQ(derivedObject->weakPtrFactory().weakPtrCount(), 2U);
437+
EXPECT_EQ(baseObjectWeakPtr.get(), derivedObject.get());
438+
}
439+
EXPECT_EQ(derivedObject->refCount(), 1U);
440+
EXPECT_EQ(derivedObject->weakPtrFactory().weakPtrCount(), 0U);
441+
}
442+
348443
template <typename T>
349444
unsigned computeSizeOfWeakHashSet(const WeakHashSet<T>& set)
350445
{

0 commit comments

Comments
 (0)