Modified: trunk/Source/_javascript_Core/ChangeLog (146567 => 146568)
--- trunk/Source/_javascript_Core/ChangeLog 2013-03-22 07:19:45 UTC (rev 146567)
+++ trunk/Source/_javascript_Core/ChangeLog 2013-03-22 07:36:58 UTC (rev 146568)
@@ -1,3 +1,36 @@
+2013-03-22 Ryosuke Niwa <[email protected]>
+
+ 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.
+
2013-03-21 Mark Hahnenberg <[email protected]>
Objective-C API: Need a good way to preserve custom properties on JS wrappers
Modified: trunk/Source/_javascript_Core/runtime/SymbolTable.cpp (146567 => 146568)
--- trunk/Source/_javascript_Core/runtime/SymbolTable.cpp 2013-03-22 07:19:45 UTC (rev 146567)
+++ trunk/Source/_javascript_Core/runtime/SymbolTable.cpp 2013-03-22 07:36:58 UTC (rev 146568)
@@ -38,7 +38,7 @@
ASSERT(other.isFat());
FatEntry* newFatEntry = new FatEntry(*other.fatEntry());
freeFatEntry();
- m_bits = bitwise_cast<intptr_t>(newFatEntry) | FatFlag;
+ m_bits = bitwise_cast<intptr_t>(newFatEntry);
return *this;
}
@@ -94,7 +94,7 @@
SymbolTableEntry::FatEntry* SymbolTableEntry::inflateSlow()
{
FatEntry* entry = new FatEntry(m_bits);
- m_bits = bitwise_cast<intptr_t>(entry) | FatFlag;
+ m_bits = bitwise_cast<intptr_t>(entry);
return entry;
}
Modified: trunk/Source/_javascript_Core/runtime/SymbolTable.h (146567 => 146568)
--- trunk/Source/_javascript_Core/runtime/SymbolTable.h 2013-03-22 07:19:45 UTC (rev 146567)
+++ trunk/Source/_javascript_Core/runtime/SymbolTable.h 2013-03-22 07:36:58 UTC (rev 146568)
@@ -93,7 +93,7 @@
class Fast {
public:
Fast()
- : m_bits(0)
+ : m_bits(SlimFlag)
{
}
@@ -104,7 +104,7 @@
bool isNull() const
{
- return !m_bits;
+ return !(m_bits & ~SlimFlag);
}
int getIndex() const
@@ -129,7 +129,7 @@
bool isFat() const
{
- return m_bits & FatFlag;
+ return !(m_bits & SlimFlag);
}
private:
@@ -138,19 +138,19 @@
};
SymbolTableEntry()
- : m_bits(0)
+ : m_bits(SlimFlag)
{
}
SymbolTableEntry(int index)
- : m_bits(0)
+ : m_bits(SlimFlag)
{
ASSERT(isValidIndex(index));
pack(index, false, false);
}
SymbolTableEntry(int index, unsigned attributes)
- : m_bits(0)
+ : m_bits(SlimFlag)
{
ASSERT(isValidIndex(index));
pack(index, attributes & ReadOnly, attributes & DontEnum);
@@ -162,7 +162,7 @@
}
SymbolTableEntry(const SymbolTableEntry& other)
- : m_bits(0)
+ : m_bits(SlimFlag)
{
*this = other;
}
@@ -178,7 +178,7 @@
bool isNull() const
{
- return !bits();
+ return !(bits() & ~SlimFlag);
}
int getIndex() const
@@ -196,7 +196,7 @@
Fast result;
wasFat = isFat();
if (wasFat)
- result.m_bits = fatEntry()->m_bits;
+ result.m_bits = fatEntry()->m_bits | SlimFlag;
else
result.m_bits = m_bits;
return result;
@@ -246,7 +246,7 @@
}
private:
- static const intptr_t FatFlag = 0x1;
+ static const intptr_t SlimFlag = 0x1;
static const intptr_t ReadOnlyFlag = 0x2;
static const intptr_t DontEnumFlag = 0x4;
static const intptr_t NotNullFlag = 0x8;
@@ -256,7 +256,7 @@
WTF_MAKE_FAST_ALLOCATED;
public:
FatEntry(intptr_t bits)
- : m_bits(bits | FatFlag)
+ : m_bits(bits & ~SlimFlag)
{
}
@@ -270,19 +270,19 @@
bool isFat() const
{
- return m_bits & FatFlag;
+ return !(m_bits & SlimFlag);
}
const FatEntry* fatEntry() const
{
ASSERT(isFat());
- return bitwise_cast<const FatEntry*>(m_bits & ~FatFlag);
+ return bitwise_cast<const FatEntry*>(m_bits);
}
FatEntry* fatEntry()
{
ASSERT(isFat());
- return bitwise_cast<FatEntry*>(m_bits & ~FatFlag);
+ return bitwise_cast<FatEntry*>(m_bits);
}
FatEntry* inflate()
@@ -319,8 +319,9 @@
void pack(int index, bool readOnly, bool dontEnum)
{
+ ASSERT(!isFat());
intptr_t& bitsRef = bits();
- bitsRef = (static_cast<intptr_t>(index) << FlagBits) | NotNullFlag;
+ bitsRef = (static_cast<intptr_t>(index) << FlagBits) | NotNullFlag | SlimFlag;
if (readOnly)
bitsRef |= ReadOnlyFlag;
if (dontEnum)
@@ -336,7 +337,6 @@
};
struct SymbolTableIndexHashTraits : HashTraits<SymbolTableEntry> {
- static const bool emptyValueIsZero = true;
static const bool needsDestruction = true;
};