Changeset 261440 in webkit


Ignore:
Timestamp:
May 9, 2020 3:29:50 PM (4 years ago)
Author:
Darin Adler
Message:

Add iterator checking to ListHashSet
https://bugs.webkit.org/show_bug.cgi?id=211669

Reviewed by Anders Carlsson.

HashSet and HashMap have iterator checking in debug builds.
Add similar checking to ListHashSet, controlled by the same
macro, CHECK_HASHTABLE_ITERATORS. Use WeakPtr to make the
implementation simple.

  • wtf/ListHashSet.h: Make ListHashSet and ListHashSetNode derive

from CanMakeWeakPtr. Add m_weakSet and m_weakPosition members to
ListHashSetConstIterator, and assert their values at the appropriate
times so we will get a breakpoint or crash.

Location:
trunk/Source/WTF
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WTF/ChangeLog

    r261437 r261440  
     12020-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
    1182020-05-08  Darin Adler  <darin@apple.com>
    219
  • trunk/Source/WTF/wtf/ListHashSet.h

    r258858 r261440  
    2424#include <wtf/HashSet.h>
    2525
     26#if CHECK_HASHTABLE_ITERATORS
     27#include <wtf/WeakPtr.h>
     28#endif
     29
    2630namespace WTF {
    2731
     
    4650template<typename HashArg> struct ListHashSetTranslator;
    4751
    48 template<typename ValueArg, typename HashArg = typename DefaultHash<ValueArg>::Hash> class ListHashSet final {
     52template<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{
    4957    WTF_MAKE_FAST_ALLOCATED;
    5058private:
     
    165173};
    166174
    167 template<typename ValueArg> struct ListHashSetNode {
    168     WTF_MAKE_FAST_ALLOCATED;
    169 public:
    170     template<typename T>
    171     ListHashSetNode(T&& value)
     175template<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)
    172183        : m_value(std::forward<T>(value))
    173184    {
     
    248259        : m_set(set)
    249260        , m_position(position)
     261#if CHECK_HASHTABLE_ITERATORS
     262        , m_weakSet(makeWeakPtr(set))
     263        , m_weakPosition(makeWeakPtr(position))
     264#endif
    250265    {
    251266    }
     
    264279    const ValueType* get() const
    265280    {
     281#if CHECK_HASHTABLE_ITERATORS
     282        ASSERT(m_weakPosition);
     283#endif
    266284        return std::addressof(m_position->m_value);
    267285    }
     
    272290    const_iterator& operator++()
    273291    {
     292#if CHECK_HASHTABLE_ITERATORS
     293        ASSERT(m_weakPosition);
     294#endif
    274295        ASSERT(m_position);
    275296        m_position = m_position->m_next;
     297#if CHECK_HASHTABLE_ITERATORS
     298        m_weakPosition = makeWeakPtr(m_position);
     299#endif
    276300        return *this;
    277301    }
     
    281305    const_iterator& operator--()
    282306    {
     307#if CHECK_HASHTABLE_ITERATORS
     308        ASSERT(m_weakSet);
     309        m_weakPosition.get();
     310#endif
    283311        ASSERT(m_position != m_set->m_head);
    284312        if (!m_position)
     
    286314        else
    287315            m_position = m_position->m_prev;
     316#if CHECK_HASHTABLE_ITERATORS
     317        m_weakPosition = makeWeakPtr(m_position);
     318#endif
    288319        return *this;
    289320    }
     
    304335    Node* node() { return m_position; }
    305336
    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
    308343};
    309344
Note: See TracChangeset for help on using the changeset viewer.