Ignore:
Timestamp:
Dec 25, 2005, 1:22:35 AM (19 years ago)
Author:
mjs
Message:

Reviewed by Eric and Dave Hyatt.

This is a somewhat cheesy change. Having to use PassRefPtr_Ref creates ambiguities
in assignment and copy construction. And this makes life way easier and removes
the need for pass(). It is not really correct, but we pretty much never need a real
const PassRefPtr, and this takes care of things for PassRefPtr temporaries.

  • kjs/identifier.cpp: (KJS::Identifier::add): No more need for pass()
  • kjs/property_map.cpp: (KJS::PropertyMap::addSparseArrayPropertiesToReferenceList): No more need for pass()
  • kjs/ustring.cpp: (KJS::UString::Rep::create): Use adoptRef (KJS::UString::UString): No more need for pass (KJS::UString::append): No more need for pass (KJS::UString::substr): No more need for pass
  • kxmlcore/PassRefPtr.h: made m_ptr mutable (ugh) (KXMLCore::PassRefPtr::PassRefPtr): Take a const PassRefPtr reference (KXMLCore::PassRefPtr::release): Made this a const method (ugh) (KXMLCore::PassRefPtr::operator=): clean up appropriately (KXMLCore::adoptRef): Added this to use instead of PassRefPtr<T>::adopt, I think it makes the behavior more clear and it is less verbose. (KXMLCore::static_pointer_cast): use adoptRef (KXMLCore::const_pointer_cast): use adoptRef
  • kxmlcore/RefPtr.h: (KXMLCore::RefPtr::RefPtr): take const PassRefPtr& (KXMLCore::PassRefPtr::operator=): take const PassRefPtr&
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/kxmlcore/PassRefPtr.h

    r11727 r11763  
    2828    template<typename T> class RefPtr;
    2929    template<typename T> class PassRefPtr;
    30 
    31     // PassRefPtr_Ref class is a helper to allow proper passing of PassRefPtr by value but not by const
    32     // reference
    33     template<typename T>
    34     struct PassRefPtr_Ref
    35     {
    36         T* m_ptr;
    37         explicit PassRefPtr_Ref(T* p) : m_ptr(p) {}
    38     };
     30    template <typename T> PassRefPtr<T> adoptRef(T *p);
    3931
    4032    template<typename T>
     
    4436        PassRefPtr() : m_ptr(0) {}
    4537        PassRefPtr(T *ptr) : m_ptr(ptr) { if (ptr) ptr->ref(); }
    46         PassRefPtr(PassRefPtr& o) : m_ptr(o.release()) {}
    47         template <typename U> PassRefPtr(PassRefPtr<U>& o) : m_ptr(o.release()) { }
     38        // It somewhat breaks the type system to allow transfer of ownership out of
     39        // a const PassRefPtr. However, it makes it much easier to work with PassRefPtr
     40        // temporaries, and we don't really have a need to use real const PassRefPtrs
     41        // anyway.
     42        PassRefPtr(const PassRefPtr& o) : m_ptr(o.release()) {}
     43        template <typename U> PassRefPtr(const PassRefPtr<U>& o) : m_ptr(o.release()) { }
    4844
    4945        ~PassRefPtr() { if (T *ptr = m_ptr) ptr->deref(); }
     
    5450        T *get() const { return m_ptr; }
    5551
    56         T *release() { T *tmp = m_ptr; m_ptr = 0; return tmp; }
     52        T *release() const { T *tmp = m_ptr; m_ptr = 0; return tmp; }
    5753
    58         template <typename U> static PassRefPtr<T> adopt(U* ptr)
    59         {
    60             PassRefPtr result((PassRefPtr_Ref<T>(ptr)));
    61             return result;
    62         }
    63        
    6454        T& operator*() const { return *m_ptr; }
    6555        T *operator->() const { return m_ptr; }
     
    7262       
    7363        PassRefPtr& operator=(T *);
    74         PassRefPtr& operator=(PassRefPtr&);
    75         template <typename U> PassRefPtr& operator=(PassRefPtr<U>&);
     64        PassRefPtr& operator=(const PassRefPtr&);
     65        template <typename U> PassRefPtr& operator=(const PassRefPtr<U>&);
    7666        template <typename U> PassRefPtr& operator=(const RefPtr<U>&);
    7767
    78         PassRefPtr(PassRefPtr_Ref<T> ref) : m_ptr(ref.m_ptr) { }
    79      
    80         PassRefPtr& operator=(PassRefPtr_Ref<T> ref)
    81         {
    82             if (m_ptr)
    83                 m_ptr->deref();
    84             m_ptr = ref.m_ptr;
    85             return *this;
    86         }
    87 
    88         template <typename U> operator PassRefPtr_Ref<U>() { return PassRefPtr_Ref<U>(release()); }
    89         template <typename U> operator PassRefPtr<U>() { return PassRefPtr_Ref<U>(release()); }
    90        
     68        friend PassRefPtr adoptRef<T>(T *);
    9169    private:
    92         T *m_ptr;
     70        // adopting constructor
     71        PassRefPtr(T *ptr, bool) : m_ptr(ptr) {}
     72        mutable T *m_ptr;
    9373    };
    9474   
     
    11494    }
    11595
    116     template <typename T> inline PassRefPtr<T>& PassRefPtr<T>::operator=(PassRefPtr<T>& ref)
     96    template <typename T> inline PassRefPtr<T>& PassRefPtr<T>::operator=(const PassRefPtr<T>& ref)
    11797    {
    11898        T *optr = ref.release();
     
    123103    }
    124104   
    125     template <typename T> template <typename U> inline PassRefPtr<T>& PassRefPtr<T>::operator=(PassRefPtr<U>& ref)
     105    template <typename T> template <typename U> inline PassRefPtr<T>& PassRefPtr<T>::operator=(const PassRefPtr<U>& ref)
    126106    {
    127107        T *optr = ref.release();
     
    182162    }
    183163   
     164    template <typename T> inline PassRefPtr<T> adoptRef(T *p)
     165    {
     166        return PassRefPtr<T>(p, true);
     167    }
     168
    184169    template <typename T, typename U> inline PassRefPtr<T> static_pointer_cast(const PassRefPtr<U>& p)
    185170    {
    186         return PassRefPtr<T>::adopt(static_cast<T *>(p.release()));
     171        return adoptRef(static_cast<T *>(p.release()));
    187172    }
    188173
    189174    template <typename T, typename U> inline PassRefPtr<T> const_pointer_cast(const PassRefPtr<U>& p)
    190175    {
    191         return PassRefPtr<T>::adopt(const_cast<T *>(p.release()));
    192     }
    193 
    194     template <typename T> inline PassRefPtr<T> pass(T *ptr)
    195     {
    196         return PassRefPtr<T>(ptr);
    197     }
    198 
    199     template <typename T> inline PassRefPtr<T> pass(const RefPtr<T>& ptr)
    200     {
    201         return PassRefPtr<T>(ptr);
     176        return adoptRef(const_cast<T *>(p.release()));
    202177    }
    203178
     
    205180
    206181using KXMLCore::PassRefPtr;
     182using KXMLCore::adoptRef;
    207183using KXMLCore::static_pointer_cast;
    208184using KXMLCore::const_pointer_cast;
    209 using KXMLCore::pass;
    210185
    211186#endif // KXMLCORE_PASS_REF_PTR_H
Note: See TracChangeset for help on using the changeset viewer.