Ignore:
Timestamp:
Jul 7, 2010, 9:07:29 AM (15 years ago)
Author:
Darin Adler
Message:

Make clear set the pointer to 0 before deletion
https://bugs.webkit.org/show_bug.cgi?id=41727

Reviewed by Adam Barth.

  • wtf/OwnArrayPtr.h: Changed code so we always set the pointer to its new

value before deleting the old one, including in the set function and the
clear function. This required changing safeDelete.

  • wtf/OwnPtr.h: Ditto. Also removed some extra null checks.
  • wtf/PassOwnPtr.h: Ditto.
  • wtf/PassRefPtr.h: Changed code so we always set the pointer to its new

value before deref'ing the old one in the clear function. Also added a
leakRef function for NonNullPassRefPtr.

  • wtf/RefPtr.h: Ditto.
  • wtf/gobject/GOwnPtr.h: More of the same.
  • wtf/gobject/GRefPtr.h: Ditto.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/wtf/OwnArrayPtr.h

    r60417 r62674  
    3131    public:
    3232        explicit OwnArrayPtr(T* ptr = 0) : m_ptr(ptr) { }
    33         ~OwnArrayPtr() { safeDelete(); }
     33        ~OwnArrayPtr() { safeDelete(m_ptr); }
    3434
    3535        T* get() const { return m_ptr; }
    3636        T* release() { T* ptr = m_ptr; m_ptr = 0; return ptr; }
    3737
    38         // FIXME: This should be renamed to adopt.
     38        // FIXME: This should be removed and replaced with PassOwnArrayPtr.
    3939        void set(T* ptr)
    4040        {
    4141            ASSERT(!ptr || m_ptr != ptr);
    42             safeDelete();
     42            T* oldPtr = m_ptr;
    4343            m_ptr = ptr;
     44            safeDelete(oldPtr);
    4445        }
    4546
    46         void clear() { safeDelete(); m_ptr = 0; }
     47        void clear();
    4748
    4849        T& operator*() const { ASSERT(m_ptr); return *m_ptr; }
     
    6465
    6566    private:
    66         void safeDelete() { typedef char known[sizeof(T) ? 1 : -1]; if (sizeof(known)) delete [] m_ptr; }
     67        static void safeDelete(T*);
    6768
    6869        T* m_ptr;
    6970    };
    7071   
     72    template<typename T> inline void OwnArrayPtr<T>::clear()
     73    {
     74        T* ptr = m_ptr;
     75        m_ptr = 0;
     76        safeDelete(ptr);
     77    }
     78
     79    template<typename T> inline void OwnArrayPtr<T>::safeDelete(T* ptr)
     80    {
     81        typedef char known[sizeof(T) ? 1 : -1];
     82        if (sizeof(known))
     83            delete [] ptr;
     84    }
     85
    7186    template <typename T> inline void swap(OwnArrayPtr<T>& a, OwnArrayPtr<T>& b) { a.swap(b); }
    7287
Note: See TracChangeset for help on using the changeset viewer.