Changeset 11727 in webkit for trunk/JavaScriptCore
- Timestamp:
- Dec 22, 2005, 8:48:08 AM (19 years ago)
- Location:
- trunk/JavaScriptCore
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/ChangeLog
r11721 r11727 1 2005-12-22 Darin Adler <[email protected]> 2 3 Reviewed by Maciej. 4 5 - fix http://bugzilla.opendarwin.org/show_bug.cgi?id=6191 6 RefPtr/PassRefPtr have a leak issue, operator== issues 7 8 * kxmlcore/PassRefPtr.h: 9 (KXMLCore::PassRefPtr::PassRefPtr): Remove non-template constructor that takes RefPtr 10 since the constructor template that takes RefPtr should be sufficient. Add a constructor 11 template that takes PassRefPtr&. 12 (KXMLCore::PassRefPtr::adopt): Use PassRefPtr_Ref to avoid setting pointer first to 13 0 and then to the pointer. 14 (KXMLCore::PassRefPtr::operator=): Added template versions that take PassRefPtr& and 15 RefPtr parameters. 16 (KXMLCore::PassRefPtr::operator PassRefPtr<U>): Changed to fix leak -- old version 17 would release and then ref. 18 (KXMLCore::operator==): Make templates have two parameters so you can mix types. 19 Also remove unneeded const in raw pointer versions. 20 (KXMLCore::operator!=): Ditto. 21 22 * kxmlcore/RefPtr.h: 23 (KXMLCore::RefPtr::RefPtr): Add constructor template that takes PassRefPtr. 24 (KXMLCore::RefPtr::operator=): Add assignment operator templates that take 25 RefPtr and PassRefPtr. 26 (KXMLCore::operator==): Make templates have two parameters so you can mix types. 27 Also remove unneeded const in raw pointer versions. 28 (KXMLCore::operator!=): Ditto. 29 1 30 2005-12-21 Timothy Hatcher <[email protected]> 2 31 -
trunk/JavaScriptCore/kxmlcore/PassRefPtr.h
r11684 r11727 44 44 PassRefPtr() : m_ptr(0) {} 45 45 PassRefPtr(T *ptr) : m_ptr(ptr) { if (ptr) ptr->ref(); } 46 PassRefPtr(const RefPtr<T>& o) : m_ptr(o.get()) { if (T *ptr = m_ptr) ptr->ref(); }47 46 PassRefPtr(PassRefPtr& o) : m_ptr(o.release()) {} 47 template <typename U> PassRefPtr(PassRefPtr<U>& o) : m_ptr(o.release()) { } 48 48 49 49 ~PassRefPtr() { if (T *ptr = m_ptr) ptr->deref(); } … … 56 56 T *release() { T *tmp = m_ptr; m_ptr = 0; return tmp; } 57 57 58 static PassRefPtr<T> adopt(T *ptr) 59 { 60 PassRefPtr result; 61 result.m_ptr = ptr; 62 return result; 58 template <typename U> static PassRefPtr<T> adopt(U* ptr) 59 { 60 PassRefPtr result((PassRefPtr_Ref<T>(ptr))); 61 return result; 63 62 } 64 63 … … 72 71 operator UnspecifiedBoolType() const { return m_ptr ? &PassRefPtr::get : 0; } 73 72 74 PassRefPtr& operator=(const RefPtr<T>&);75 73 PassRefPtr& operator=(T *); 76 74 PassRefPtr& operator=(PassRefPtr&); 75 template <typename U> PassRefPtr& operator=(PassRefPtr<U>&); 76 template <typename U> PassRefPtr& operator=(const RefPtr<U>&); 77 77 78 78 PassRefPtr(PassRefPtr_Ref<T> ref) : m_ptr(ref.m_ptr) { } … … 86 86 } 87 87 88 template<typename U> 89 operator PassRefPtr_Ref<U>() 90 { 91 return PassRefPtr_Ref<U>(release()); 92 } 93 94 template<typename U> 95 operator PassRefPtr<U>() 96 { 97 return PassRefPtr<U>(this->release()); 98 } 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()); } 99 90 100 91 private: … … 102 93 }; 103 94 104 template < class T> inline PassRefPtr<T>& PassRefPtr<T>::operator=(const RefPtr<T>& o)95 template <typename T> template <typename U> inline PassRefPtr<T>& PassRefPtr<T>::operator=(const RefPtr<U>& o) 105 96 { 106 97 T *optr = o.m_ptr; … … 113 104 } 114 105 115 template < class T> inline PassRefPtr<T>& PassRefPtr<T>::operator=(T *optr)106 template <typename T> inline PassRefPtr<T>& PassRefPtr<T>::operator=(T* optr) 116 107 { 117 108 if (optr) … … 123 114 } 124 115 125 template < classT> inline PassRefPtr<T>& PassRefPtr<T>::operator=(PassRefPtr<T>& ref)116 template <typename T> inline PassRefPtr<T>& PassRefPtr<T>::operator=(PassRefPtr<T>& ref) 126 117 { 127 118 T *optr = ref.release(); … … 132 123 } 133 124 134 template <class T> inline bool operator==(const PassRefPtr<T>& a, const PassRefPtr<T>& b) 125 template <typename T> template <typename U> inline PassRefPtr<T>& PassRefPtr<T>::operator=(PassRefPtr<U>& ref) 126 { 127 T *optr = ref.release(); 128 if (T *ptr = m_ptr) 129 ptr->deref(); 130 m_ptr = optr; 131 return *this; 132 } 133 134 template <typename T, typename U> inline bool operator==(const PassRefPtr<T>& a, const PassRefPtr<U>& b) 135 135 { 136 136 return a.get() == b.get(); 137 137 } 138 138 139 template < class T> inline bool operator==(const PassRefPtr<T>& a, const RefPtr<T>& b)139 template <typename T, typename U> inline bool operator==(const PassRefPtr<T>& a, const RefPtr<U>& b) 140 140 { 141 141 return a.get() == b.get(); 142 142 } 143 143 144 template < class T> inline bool operator==(const RefPtr<T>& a, const PassRefPtr<T>& b)144 template <typename T, typename U> inline bool operator==(const RefPtr<T>& a, const PassRefPtr<U>& b) 145 145 { 146 146 return a.get() == b.get(); 147 147 } 148 148 149 template < class T> inline bool operator==(const PassRefPtr<T>& a, const T *b)149 template <typename T, typename U> inline bool operator==(const PassRefPtr<T>& a, U* b) 150 150 { 151 151 return a.get() == b; 152 152 } 153 153 154 template < class T> inline bool operator==(const T *a, const PassRefPtr<T>& b)154 template <typename T, typename U> inline bool operator==(T* a, const PassRefPtr<U>& b) 155 155 { 156 156 return a == b.get(); 157 157 } 158 158 159 template < class T> inline bool operator!=(const PassRefPtr<T>& a, const PassRefPtr<T>& b)159 template <typename T, typename U> inline bool operator!=(const PassRefPtr<T>& a, const PassRefPtr<U>& b) 160 160 { 161 161 return a.get() != b.get(); 162 162 } 163 163 164 template < class T> inline bool operator!=(const PassRefPtr<T>& a, const RefPtr<T>& b)164 template <typename T, typename U> inline bool operator!=(const PassRefPtr<T>& a, const RefPtr<U>& b) 165 165 { 166 166 return a.get() != b.get(); 167 167 } 168 168 169 template < class T> inline bool operator!=(const RefPtr<T>& a, const PassRefPtr<T>& b)169 template <typename T, typename U> inline bool operator!=(const RefPtr<T>& a, const PassRefPtr<U>& b) 170 170 { 171 171 return a.get() != b.get(); 172 172 } 173 173 174 template < class T> inline bool operator!=(const PassRefPtr<T>& a, const T *b)174 template <typename T, typename U> inline bool operator!=(const PassRefPtr<T>& a, U* b) 175 175 { 176 176 return a.get() != b; 177 177 } 178 178 179 template < class T> inline bool operator!=(const T *a, const PassRefPtr<T>& b)179 template <typename T, typename U> inline bool operator!=(T* a, const PassRefPtr<U>& b) 180 180 { 181 181 return a != b.get(); 182 182 } 183 183 184 template < class T, classU> inline PassRefPtr<T> static_pointer_cast(const PassRefPtr<U>& p)184 template <typename T, typename U> inline PassRefPtr<T> static_pointer_cast(const PassRefPtr<U>& p) 185 185 { 186 186 return PassRefPtr<T>::adopt(static_cast<T *>(p.release())); 187 187 } 188 188 189 template < class T, classU> inline PassRefPtr<T> const_pointer_cast(const PassRefPtr<U>& p)189 template <typename T, typename U> inline PassRefPtr<T> const_pointer_cast(const PassRefPtr<U>& p) 190 190 { 191 191 return PassRefPtr<T>::adopt(const_cast<T *>(p.release())); -
trunk/JavaScriptCore/kxmlcore/RefPtr.h
r11684 r11727 26 26 namespace KXMLCore { 27 27 28 template < classT> class PassRefPtr;29 template < classT> class PassRefPtr_Ref;28 template <typename T> class PassRefPtr; 29 template <typename T> class PassRefPtr_Ref; 30 30 31 template < classT> class RefPtr31 template <typename T> class RefPtr 32 32 { 33 33 public: … … 35 35 RefPtr(T *ptr) : m_ptr(ptr) { if (ptr) ptr->ref(); } 36 36 RefPtr(const RefPtr& o) : m_ptr(o.m_ptr) { if (T *ptr = m_ptr) ptr->ref(); } 37 template <typename U> RefPtr(PassRefPtr<U>&); 38 template <typename U> RefPtr(PassRefPtr_Ref<U>); 37 39 38 40 ~RefPtr() { if (T *ptr = m_ptr) ptr->deref(); } 39 41 40 template < classU> RefPtr(const RefPtr<U>& o) : m_ptr(o.get()) { if (T *ptr = m_ptr) ptr->ref(); }42 template <typename U> RefPtr(const RefPtr<U>& o) : m_ptr(o.get()) { if (T *ptr = m_ptr) ptr->ref(); } 41 43 42 44 T *get() const { return m_ptr; } … … 55 57 RefPtr& operator=(PassRefPtr<T>&); 56 58 RefPtr& operator=(PassRefPtr_Ref<T>); 59 template <typename U> RefPtr& operator=(const RefPtr<U>&); 60 template <typename U> RefPtr& operator=(PassRefPtr<U>&); 61 template <typename U> RefPtr& operator=(PassRefPtr_Ref<U>); 57 62 58 63 private: … … 60 65 }; 61 66 62 template <class T> RefPtr<T>& RefPtr<T>::operator=(const RefPtr<T>& o) 67 template <typename T> template <typename U> inline RefPtr<T>::RefPtr(PassRefPtr_Ref<U> ref) 68 : m_ptr(ref.m_ptr) 69 { 70 } 71 72 template <typename T> template <typename U> inline RefPtr<T>::RefPtr(PassRefPtr<U>& o) 73 : m_ptr(o.release()) 74 { 75 } 76 77 template <typename T> RefPtr<T>& RefPtr<T>::operator=(const RefPtr<T>& o) 63 78 { 64 79 T *optr = o.m_ptr; 65 80 if (optr) 66 81 optr->ref(); 67 if ( T *ptr =m_ptr)68 ptr->deref();82 if (m_ptr) 83 m_ptr->deref(); 69 84 m_ptr = optr; 70 85 return *this; 71 86 } 72 87 73 template <class T> inline RefPtr<T>& RefPtr<T>::operator=(T *optr) 88 template <typename T> template <typename U> RefPtr<T>& RefPtr<T>::operator=(const RefPtr<U>& o) 89 { 90 T *optr = o.m_ptr; 91 if (optr) 92 optr->ref(); 93 if (m_ptr) 94 m_ptr->deref(); 95 m_ptr = optr; 96 return *this; 97 } 98 99 template <typename T> inline RefPtr<T>& RefPtr<T>::operator=(T* optr) 74 100 { 75 101 if (optr) 76 102 optr->ref(); 77 if ( T *ptr =m_ptr)78 ptr->deref();103 if (m_ptr) 104 m_ptr->deref(); 79 105 m_ptr = optr; 80 106 return *this; 81 107 } 82 108 83 template < class T> inline RefPtr<T>& RefPtr<T>::operator=(PassRefPtr_Ref<T> ref)109 template <typename T> template <typename U> inline RefPtr<T>& RefPtr<T>::operator=(PassRefPtr_Ref<U> ref) 84 110 { 85 111 if (m_ptr) … … 89 115 } 90 116 91 template < class T> inline RefPtr<T>& RefPtr<T>::operator=(PassRefPtr<T>& o)117 template <typename T> inline RefPtr<T>& RefPtr<T>::operator=(PassRefPtr<T>& o) 92 118 { 93 if ( T *ptr =m_ptr)94 ptr->deref();119 if (m_ptr) 120 m_ptr->deref(); 95 121 m_ptr = o.release(); 96 122 return *this; 97 123 } 98 124 99 template <class T> inline bool operator==(const RefPtr<T>& a, const RefPtr<T>& b) 125 template <typename T> inline RefPtr<T>& RefPtr<T>::operator=(PassRefPtr_Ref<T> ref) 126 { 127 if (m_ptr) 128 m_ptr->deref(); 129 m_ptr = ref.m_ptr; 130 return *this; 131 } 132 133 template <typename T> template <typename U> inline RefPtr<T>& RefPtr<T>::operator=(PassRefPtr<U>& o) 134 { 135 if (m_ptr) 136 m_ptr->deref(); 137 m_ptr = o.release(); 138 return *this; 139 } 140 141 template <typename T, typename U> inline bool operator==(const RefPtr<T>& a, const RefPtr<U>& b) 100 142 { 101 143 return a.get() == b.get(); 102 144 } 103 145 104 template < class T> inline bool operator==(const RefPtr<T>& a, const T *b)146 template <typename T, typename U> inline bool operator==(const RefPtr<T>& a, U* b) 105 147 { 106 148 return a.get() == b; 107 149 } 108 150 109 template < class T> inline bool operator==(const T *a, const RefPtr<T>& b)151 template <typename T, typename U> inline bool operator==(T* a, const RefPtr<U>& b) 110 152 { 111 153 return a == b.get(); 112 154 } 113 155 114 template < class T> inline bool operator!=(const RefPtr<T>& a, const RefPtr<T>& b)156 template <typename T, typename U> inline bool operator!=(const RefPtr<T>& a, const RefPtr<U>& b) 115 157 { 116 158 return a.get() != b.get(); 117 159 } 118 160 119 template < class T> inline bool operator!=(const RefPtr<T>& a, const T *b)161 template <typename T, typename U> inline bool operator!=(const RefPtr<T>& a, U* b) 120 162 { 121 163 return a.get() != b; 122 164 } 123 165 124 template < class T> inline bool operator!=(const T *a, const RefPtr<T>& b)166 template <typename T, typename U> inline bool operator!=(T* a, const RefPtr<U>& b) 125 167 { 126 168 return a != b.get(); 127 169 } 128 170 129 template < class T, class U> inline RefPtr<T> static_pointer_cast(const RefPtr<U>& p)171 template <typename T, typename U> inline RefPtr<T> static_pointer_cast(const RefPtr<U>& p) 130 172 { 131 173 return RefPtr<T>(static_cast<T *>(p.get())); 132 174 } 133 175 134 template < class T, class U> inline RefPtr<T> const_pointer_cast(const RefPtr<U>& p)176 template <typename T, typename U> inline RefPtr<T> const_pointer_cast(const RefPtr<U>& p) 135 177 { 136 178 return RefPtr<T>(const_cast<T *>(p.get()));
Note:
See TracChangeset
for help on using the changeset viewer.