Changeset 146568 in webkit


Ignore:
Timestamp:
Mar 22, 2013 12:36:58 AM (11 years ago)
Author:
rniwa@webkit.org
Message:

Leak bots erroneously report JSC::WatchpointSet as leaking
https://bugs.webkit.org/show_bug.cgi?id=107781

Reviewed by Filip Pizlo.

Since leaks doesn't support tagged pointers, avoid using it by flipping the bit flag to indicate
the entry is "fat". We set the flag when the entry is NOT fat; i.e. slim.

Replaced FatFlag by SlimFlag and initialized m_bits with this flag to indicate that the entry is
initially "slim".

  • runtime/SymbolTable.cpp:

(JSC::SymbolTableEntry::copySlow): Don't set FatFlag since it has been replaced by SlimFlag.
(JSC::SymbolTableEntry::inflateSlow): Ditto.

  • runtime/SymbolTable.h:

(JSC::SymbolTableEntry::Fast::Fast): Set SlimFlag by default.
(JSC::SymbolTableEntry::Fast::isNull): Ignore SlimFlag.
(JSC::SymbolTableEntry::Fast::isFat): An entry is fat when m_bits is not entirely zero and SlimFlag
is not set.

(JSC::SymbolTableEntry::SymbolTableEntry): Set SlimFlag by default.
(JSC::SymbolTableEntry::SymbolTableEntry::getFast): Set SlimFlag when creating Fast from a fat entry.
(JSC::SymbolTableEntry::isNull): Ignore SlimFlag.
(JSC::SymbolTableEntry::FatEntry::FatEntry): Strip SlimFlag.
(JSC::SymbolTableEntry::isFat): An entry is fat when m_bits is not entirely zero and SlimFlag is unset.
(JSC::SymbolTableEntry::fatEntry): Don't strip FatFlag as this flag doesn't exist anymore.
(JSC::SymbolTableEntry::pack): Preserve SlimFlag.

(JSC::SymbolTableIndexHashTraits): empty value is no longer zero so don't set emptyValueIsZero true.

Location:
trunk/Source/JavaScriptCore
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/ChangeLog

    r146558 r146568  
     12013-03-22  Ryosuke Niwa  <rniwa@webkit.org>
     2
     3        Leak bots erroneously report JSC::WatchpointSet as leaking
     4        https://bugs.webkit.org/show_bug.cgi?id=107781
     5
     6        Reviewed by Filip Pizlo.
     7
     8        Since leaks doesn't support tagged pointers, avoid using it by flipping the bit flag to indicate
     9        the entry is "fat". We set the flag when the entry is NOT fat; i.e. slim.
     10
     11        Replaced FatFlag by SlimFlag and initialized m_bits with this flag to indicate that the entry is
     12        initially "slim".
     13
     14        * runtime/SymbolTable.cpp:
     15        (JSC::SymbolTableEntry::copySlow): Don't set FatFlag since it has been replaced by SlimFlag.
     16        (JSC::SymbolTableEntry::inflateSlow): Ditto.
     17
     18        * runtime/SymbolTable.h:
     19        (JSC::SymbolTableEntry::Fast::Fast): Set SlimFlag by default.
     20        (JSC::SymbolTableEntry::Fast::isNull): Ignore SlimFlag.
     21        (JSC::SymbolTableEntry::Fast::isFat): An entry is fat when m_bits is not entirely zero and SlimFlag
     22        is not set.
     23
     24        (JSC::SymbolTableEntry::SymbolTableEntry): Set SlimFlag by default.
     25        (JSC::SymbolTableEntry::SymbolTableEntry::getFast): Set SlimFlag when creating Fast from a fat entry.
     26        (JSC::SymbolTableEntry::isNull): Ignore SlimFlag.
     27        (JSC::SymbolTableEntry::FatEntry::FatEntry): Strip SlimFlag.
     28        (JSC::SymbolTableEntry::isFat): An entry is fat when m_bits is not entirely zero and SlimFlag is unset.
     29        (JSC::SymbolTableEntry::fatEntry): Don't strip FatFlag as this flag doesn't exist anymore.
     30        (JSC::SymbolTableEntry::pack): Preserve SlimFlag.
     31
     32        (JSC::SymbolTableIndexHashTraits): empty value is no longer zero so don't set emptyValueIsZero true.
     33
    1342013-03-21  Mark Hahnenberg  <mhahnenberg@apple.com>
    235
  • trunk/Source/JavaScriptCore/runtime/SymbolTable.cpp

    r126695 r146568  
    3939    FatEntry* newFatEntry = new FatEntry(*other.fatEntry());
    4040    freeFatEntry();
    41     m_bits = bitwise_cast<intptr_t>(newFatEntry) | FatFlag;
     41    m_bits = bitwise_cast<intptr_t>(newFatEntry);
    4242    return *this;
    4343}
     
    9595{
    9696    FatEntry* entry = new FatEntry(m_bits);
    97     m_bits = bitwise_cast<intptr_t>(entry) | FatFlag;
     97    m_bits = bitwise_cast<intptr_t>(entry);
    9898    return entry;
    9999}
  • trunk/Source/JavaScriptCore/runtime/SymbolTable.h

    r132566 r146568  
    9494        public:
    9595            Fast()
    96                 : m_bits(0)
     96                : m_bits(SlimFlag)
    9797            {
    9898            }
     
    105105            bool isNull() const
    106106            {
    107                 return !m_bits;
     107                return !(m_bits & ~SlimFlag);
    108108            }
    109109
     
    130130            bool isFat() const
    131131            {
    132                 return m_bits & FatFlag;
     132                return !(m_bits & SlimFlag);
    133133            }
    134134           
     
    139139
    140140        SymbolTableEntry()
    141             : m_bits(0)
     141            : m_bits(SlimFlag)
    142142        {
    143143        }
    144144
    145145        SymbolTableEntry(int index)
    146             : m_bits(0)
     146            : m_bits(SlimFlag)
    147147        {
    148148            ASSERT(isValidIndex(index));
     
    151151
    152152        SymbolTableEntry(int index, unsigned attributes)
    153             : m_bits(0)
     153            : m_bits(SlimFlag)
    154154        {
    155155            ASSERT(isValidIndex(index));
     
    163163       
    164164        SymbolTableEntry(const SymbolTableEntry& other)
    165             : m_bits(0)
     165            : m_bits(SlimFlag)
    166166        {
    167167            *this = other;
     
    179179        bool isNull() const
    180180        {
    181             return !bits();
     181            return !(bits() & ~SlimFlag);
    182182        }
    183183
     
    197197            wasFat = isFat();
    198198            if (wasFat)
    199                 result.m_bits = fatEntry()->m_bits;
     199                result.m_bits = fatEntry()->m_bits | SlimFlag;
    200200            else
    201201                result.m_bits = m_bits;
     
    247247       
    248248    private:
    249         static const intptr_t FatFlag = 0x1;
     249        static const intptr_t SlimFlag = 0x1;
    250250        static const intptr_t ReadOnlyFlag = 0x2;
    251251        static const intptr_t DontEnumFlag = 0x4;
     
    257257        public:
    258258            FatEntry(intptr_t bits)
    259                 : m_bits(bits | FatFlag)
     259                : m_bits(bits & ~SlimFlag)
    260260            {
    261261            }
     
    271271        bool isFat() const
    272272        {
    273             return m_bits & FatFlag;
     273            return !(m_bits & SlimFlag);
    274274        }
    275275       
     
    277277        {
    278278            ASSERT(isFat());
    279             return bitwise_cast<const FatEntry*>(m_bits & ~FatFlag);
     279            return bitwise_cast<const FatEntry*>(m_bits);
    280280        }
    281281       
     
    283283        {
    284284            ASSERT(isFat());
    285             return bitwise_cast<FatEntry*>(m_bits & ~FatFlag);
     285            return bitwise_cast<FatEntry*>(m_bits);
    286286        }
    287287       
     
    320320        void pack(int index, bool readOnly, bool dontEnum)
    321321        {
     322            ASSERT(!isFat());
    322323            intptr_t& bitsRef = bits();
    323             bitsRef = (static_cast<intptr_t>(index) << FlagBits) | NotNullFlag;
     324            bitsRef = (static_cast<intptr_t>(index) << FlagBits) | NotNullFlag | SlimFlag;
    324325            if (readOnly)
    325326                bitsRef |= ReadOnlyFlag;
     
    337338
    338339    struct SymbolTableIndexHashTraits : HashTraits<SymbolTableEntry> {
    339         static const bool emptyValueIsZero = true;
    340340        static const bool needsDestruction = true;
    341341    };
Note: See TracChangeset for help on using the changeset viewer.