Changeset 160187 in webkit


Ignore:
Timestamp:
Dec 5, 2013 12:40:21 PM (10 years ago)
Author:
andersca@apple.com
Message:

Tweak WeakObjCPtr
https://bugs.webkit.org/show_bug.cgi?id=125311

Reviewed by Darin Adler.

Source/WebKit2:

Make it possible to use WeakObjCPtr with pointer types such as id. Also,
add a getAutoreleased() member that will load the weak pointer and retain + autorelease it.

  • Shared/mac/WeakObjCPtr.h:

(WebKit::WeakObjCPtr::WeakObjCPtr):
(WebKit::WeakObjCPtr::operator=):
(WebKit::WeakObjCPtr::get):
(WebKit::WeakObjCPtr::getAutoreleased):

Tools:

Split up tests into more logical groups. Add new tests for new functionality.

  • TestWebKitAPI/Tests/WebKit2/mac/WeakObjCPtr.mm:
Location:
trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit2/ChangeLog

    r160162 r160187  
     12013-12-05  Anders Carlsson  <andersca@apple.com>
     2
     3        Tweak WeakObjCPtr
     4        https://bugs.webkit.org/show_bug.cgi?id=125311
     5
     6        Reviewed by Darin Adler.
     7
     8        Make it possible to use WeakObjCPtr with pointer types such as id. Also,
     9        add a getAutoreleased() member that will load the weak pointer and retain + autorelease it.
     10
     11        * Shared/mac/WeakObjCPtr.h:
     12        (WebKit::WeakObjCPtr::WeakObjCPtr):
     13        (WebKit::WeakObjCPtr::operator=):
     14        (WebKit::WeakObjCPtr::get):
     15        (WebKit::WeakObjCPtr::getAutoreleased):
     16
    1172013-12-05  Zan Dobersek  <zdobersek@igalia.com>
    218
  • trunk/Source/WebKit2/Shared/mac/WeakObjCPtr.h

    r160146 r160187  
    2828
    2929#include <objc/runtime.h>
     30#include <type_traits>
    3031#include <wtf/RetainPtr.h>
    3132
     
    4445template<typename T> class WeakObjCPtr {
    4546public:
     47    typedef typename std::remove_pointer<T>::type ValueType;
     48
    4649    WeakObjCPtr()
    4750        : m_weakReference(nullptr)
     
    4952    }
    5053
    51     WeakObjCPtr(T *ptr)
     54    WeakObjCPtr(ValueType *ptr)
    5255    {
    5356        objc_initWeak(&m_weakReference, ptr);
     
    5962    }
    6063
    61     WeakObjCPtr& operator=(T *ptr)
     64    WeakObjCPtr& operator=(ValueType *ptr)
    6265    {
    6366        objc_storeWeak(&m_weakReference, ptr);
     
    6669    }
    6770
    68     RetainPtr<T> get() const
     71    RetainPtr<ValueType> get() const
    6972    {
    7073        return adoptNS(objc_loadWeakRetained(const_cast<id*>(&m_weakReference)));
     74    }
     75
     76    ValueType *getAutoreleased() const
     77    {
     78        return static_cast<ValueType *>(objc_loadWeak(const_cast<id*>(&m_weakReference)));
    7179    }
    7280
  • trunk/Tools/ChangeLog

    r160173 r160187  
     12013-12-05  Anders Carlsson  <andersca@apple.com>
     2
     3        Tweak WeakObjCPtr
     4        https://bugs.webkit.org/show_bug.cgi?id=125311
     5
     6        Reviewed by Darin Adler.
     7
     8        Split up tests into more logical groups. Add new tests for new functionality.
     9
     10        * TestWebKitAPI/Tests/WebKit2/mac/WeakObjCPtr.mm:
     11
    1122013-12-05  Carlos Garcia Campos  <cgarcia@igalia.com>
    213
  • trunk/Tools/TestWebKitAPI/Tests/WebKit2/mac/WeakObjCPtr.mm

    r160146 r160187  
    3030using WebKit::WeakObjCPtr;
    3131
    32 TEST(WebKit2, WeakObjCPtr)
     32TEST(WebKit2_WeakObjCPtr, Construction)
    3333{
    34     // Test construction.
     34    NSObject *object = [[NSObject alloc] init];
     35
     36    WeakObjCPtr<NSObject> weak(object);
     37
     38    EXPECT_EQ(weak.get(), object);
     39
     40    [object release];
     41
     42    EXPECT_EQ(weak.get(), (void*)nil);
     43}
     44
     45TEST(WebKit2_WeakObjCPtr, Assignment)
     46{
     47    NSObject *object1 = [[NSObject alloc] init];
     48
     49    WeakObjCPtr<NSObject> weak(object1);
     50
     51    EXPECT_EQ(weak.get(), object1);
     52
     53    NSObject *object2 = [[NSObject alloc] init];
     54
     55    weak = object2;
     56    EXPECT_EQ(weak.get(), object2);
     57
     58    [object1 release];
     59    EXPECT_EQ(weak.get(), object2);
     60
     61    [object2 release];
     62    EXPECT_EQ(weak.get(), (void*)nil);
     63}
     64
     65TEST(WebKit2_WeakObjCPtr, ObjectOutlivesItsWeakPointer)
     66{
     67    NSObject *object = [[NSObject alloc] init];
     68
    3569    {
    36         NSObject *object = [[NSObject alloc] init];
    37 
    3870        WeakObjCPtr<NSObject> weak(object);
    3971
    4072        EXPECT_EQ(weak.get(), object);
     73    }
    4174
     75    [object release];
     76}
     77
     78TEST(WebKit2_WeakObjCPtr, GetAutoreleased)
     79{
     80    WeakObjCPtr<NSObject> weak;
     81
     82    @autoreleasepool {
     83        NSObject *object = [[NSObject alloc] init];
     84
     85        weak = object;
     86
     87        EXPECT_EQ(weak.getAutoreleased(), object);
     88       
    4289        [object release];
    4390
    44         EXPECT_EQ(weak.get(), (void*)nil);
     91        // The object is still in the autorelease pool.
     92        EXPECT_EQ(weak.getAutoreleased(), object);
    4593    }
    4694
    47     // Test assignment.
    48     {
    49         NSObject *object1 = [[NSObject alloc] init];
     95    EXPECT_EQ(weak.getAutoreleased(), (id)nil);
     96}
    5097
    51         WeakObjCPtr<NSObject> weak(object1);
     98TEST(WebKit2_WeakObjCPtr, Id)
     99{
     100    id object = [[NSObject alloc] init];
     101    WeakObjCPtr<id> weak(object);
    52102
    53         EXPECT_EQ(weak.get(), object1);
     103    EXPECT_EQ(weak.get(), object);
    54104
    55         NSObject *object2 = [[NSObject alloc] init];
     105    [object release];
    56106
    57         weak = object2;
    58         EXPECT_EQ(weak.get(), object2);
    59 
    60         [object1 release];
    61         EXPECT_EQ(weak.get(), object2);
    62 
    63         [object2 release];
    64         EXPECT_EQ(weak.get(), (void*)nil);
    65     }
    66 
    67     // Test having an object that outlives its weak pointer.
    68     {
    69         NSObject *object = [[NSObject alloc] init];
    70 
    71         {
    72             WeakObjCPtr<NSObject> weak(object);
    73 
    74             EXPECT_EQ(weak.get(), object);
    75         }
    76 
    77         [object release];
    78     }
    79 
     107    EXPECT_EQ(weak.get(), (void*)nil);
    80108}
Note: See TracChangeset for help on using the changeset viewer.