Changeset 261440 in webkit
- Timestamp:
- May 9, 2020 3:29:50 PM (4 years ago)
- Location:
- trunk/Source/WTF
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WTF/ChangeLog
r261437 r261440 1 2020-05-09 Darin Adler <darin@apple.com> 2 3 Add iterator checking to ListHashSet 4 https://bugs.webkit.org/show_bug.cgi?id=211669 5 6 Reviewed by Anders Carlsson. 7 8 HashSet and HashMap have iterator checking in debug builds. 9 Add similar checking to ListHashSet, controlled by the same 10 macro, CHECK_HASHTABLE_ITERATORS. Use WeakPtr to make the 11 implementation simple. 12 13 * wtf/ListHashSet.h: Make ListHashSet and ListHashSetNode derive 14 from CanMakeWeakPtr. Add m_weakSet and m_weakPosition members to 15 ListHashSetConstIterator, and assert their values at the appropriate 16 times so we will get a breakpoint or crash. 17 1 18 2020-05-08 Darin Adler <darin@apple.com> 2 19 -
trunk/Source/WTF/wtf/ListHashSet.h
r258858 r261440 24 24 #include <wtf/HashSet.h> 25 25 26 #if CHECK_HASHTABLE_ITERATORS 27 #include <wtf/WeakPtr.h> 28 #endif 29 26 30 namespace WTF { 27 31 … … 46 50 template<typename HashArg> struct ListHashSetTranslator; 47 51 48 template<typename ValueArg, typename HashArg = typename DefaultHash<ValueArg>::Hash> class ListHashSet final { 52 template<typename ValueArg, typename HashArg = typename DefaultHash<ValueArg>::Hash> class ListHashSet final 53 #if CHECK_HASHTABLE_ITERATORS 54 : public CanMakeWeakPtr<ListHashSet<ValueArg, HashArg>> 55 #endif 56 { 49 57 WTF_MAKE_FAST_ALLOCATED; 50 58 private: … … 165 173 }; 166 174 167 template<typename ValueArg> struct ListHashSetNode { 168 WTF_MAKE_FAST_ALLOCATED; 169 public: 170 template<typename T> 171 ListHashSetNode(T&& value) 175 template<typename ValueArg> struct ListHashSetNode 176 #if CHECK_HASHTABLE_ITERATORS 177 : CanMakeWeakPtr<ListHashSetNode<ValueArg>> 178 #endif 179 { 180 WTF_MAKE_STRUCT_FAST_ALLOCATED; 181 182 template<typename T> ListHashSetNode(T&& value) 172 183 : m_value(std::forward<T>(value)) 173 184 { … … 248 259 : m_set(set) 249 260 , m_position(position) 261 #if CHECK_HASHTABLE_ITERATORS 262 , m_weakSet(makeWeakPtr(set)) 263 , m_weakPosition(makeWeakPtr(position)) 264 #endif 250 265 { 251 266 } … … 264 279 const ValueType* get() const 265 280 { 281 #if CHECK_HASHTABLE_ITERATORS 282 ASSERT(m_weakPosition); 283 #endif 266 284 return std::addressof(m_position->m_value); 267 285 } … … 272 290 const_iterator& operator++() 273 291 { 292 #if CHECK_HASHTABLE_ITERATORS 293 ASSERT(m_weakPosition); 294 #endif 274 295 ASSERT(m_position); 275 296 m_position = m_position->m_next; 297 #if CHECK_HASHTABLE_ITERATORS 298 m_weakPosition = makeWeakPtr(m_position); 299 #endif 276 300 return *this; 277 301 } … … 281 305 const_iterator& operator--() 282 306 { 307 #if CHECK_HASHTABLE_ITERATORS 308 ASSERT(m_weakSet); 309 m_weakPosition.get(); 310 #endif 283 311 ASSERT(m_position != m_set->m_head); 284 312 if (!m_position) … … 286 314 else 287 315 m_position = m_position->m_prev; 316 #if CHECK_HASHTABLE_ITERATORS 317 m_weakPosition = makeWeakPtr(m_position); 318 #endif 288 319 return *this; 289 320 } … … 304 335 Node* node() { return m_position; } 305 336 306 const ListHashSetType* m_set; 307 Node* m_position; 337 const ListHashSetType* m_set { nullptr }; 338 Node* m_position { nullptr }; 339 #if CHECK_HASHTABLE_ITERATORS 340 WeakPtr<const ListHashSetType> m_weakSet; 341 WeakPtr<Node> m_weakPosition; 342 #endif 308 343 }; 309 344
Note: See TracChangeset
for help on using the changeset viewer.