| Index: third_party/WebKit/Source/platform/heap/HeapPage.h
|
| diff --git a/third_party/WebKit/Source/platform/heap/HeapPage.h b/third_party/WebKit/Source/platform/heap/HeapPage.h
|
| index 1130f79ce35b3577a87d158f5b4e8317a19b905b..3ac08725dae3082cd518121be74c36abb0535412 100644
|
| --- a/third_party/WebKit/Source/platform/heap/HeapPage.h
|
| +++ b/third_party/WebKit/Source/platform/heap/HeapPage.h
|
| @@ -195,26 +195,31 @@ class PLATFORM_EXPORT HeapObjectHeader {
|
| (gcInfoIndex == gcInfoIndexForFreeListHeader ? headerFreedBitMask : 0));
|
| }
|
|
|
| - NO_SANITIZE_ADDRESS
|
| - bool isFree() const { return m_encoded & headerFreedBitMask; }
|
| - NO_SANITIZE_ADDRESS
|
| - bool isPromptlyFreed() const {
|
| + NO_SANITIZE_ADDRESS bool isFree() const {
|
| + return m_encoded & headerFreedBitMask;
|
| + }
|
| +
|
| + NO_SANITIZE_ADDRESS bool isPromptlyFreed() const {
|
| return (m_encoded & headerPromptlyFreedBitMask) ==
|
| headerPromptlyFreedBitMask;
|
| }
|
| - NO_SANITIZE_ADDRESS
|
| - void markPromptlyFreed() { m_encoded |= headerPromptlyFreedBitMask; }
|
| +
|
| + NO_SANITIZE_ADDRESS void markPromptlyFreed() {
|
| + m_encoded |= headerPromptlyFreedBitMask;
|
| + }
|
| +
|
| size_t size() const;
|
|
|
| - NO_SANITIZE_ADDRESS
|
| - size_t gcInfoIndex() const {
|
| + NO_SANITIZE_ADDRESS size_t gcInfoIndex() const {
|
| return (m_encoded & headerGCInfoIndexMask) >> headerGCInfoIndexShift;
|
| }
|
| - NO_SANITIZE_ADDRESS
|
| - void setSize(size_t size) {
|
| +
|
| + NO_SANITIZE_ADDRESS void setSize(size_t size) {
|
| ASSERT(size < nonLargeObjectPageSizeMax);
|
| + checkHeader();
|
| m_encoded = static_cast<uint32_t>(size) | (m_encoded & ~headerSizeMask);
|
| }
|
| +
|
| bool isWrapperHeaderMarked() const;
|
| void markWrapperHeader();
|
| void unmarkWrapperHeader();
|
| @@ -226,23 +231,27 @@ class PLATFORM_EXPORT HeapObjectHeader {
|
| size_t payloadSize();
|
| Address payloadEnd();
|
|
|
| - // TODO(633030): Make |checkHeader| and |zapMagic| private. This class should
|
| - // manage its integrity on its own, without requiring outside callers to
|
| - // explicitly check.
|
| - void checkHeader() const;
|
| + void finalize(Address, size_t);
|
| + static HeapObjectHeader* fromPayload(const void*);
|
| +
|
| + // Some callers formerly called |fromPayload| only for its side-effect of
|
| + // calling |checkHeader| (which is now private). This function does that, but
|
| + // its explanatory name makes the intention at the call sites easier to
|
| + // understand, and is public.
|
| + static void checkFromPayload(const void*);
|
|
|
| + static const uint32_t zappedMagic = 0xDEAD4321;
|
| +
|
| + protected:
|
| #if DCHECK_IS_ON() && CPU(64BIT)
|
| // Zap |m_magic| with a new magic number that means there was once an object
|
| // allocated here, but it was freed because nobody marked it during GC.
|
| void zapMagic();
|
| #endif
|
|
|
| - void finalize(Address, size_t);
|
| - static HeapObjectHeader* fromPayload(const void*);
|
| -
|
| - static const uint32_t zappedMagic = 0xDEAD4321;
|
| -
|
| private:
|
| + void checkHeader() const;
|
| +
|
| #if CPU(64BIT)
|
| // Returns a random value.
|
| //
|
| @@ -254,7 +263,7 @@ class PLATFORM_EXPORT HeapObjectHeader {
|
| // arbitrary infoleak bug (used twice).
|
| uint32_t getMagic() const;
|
| uint32_t m_magic;
|
| -#endif
|
| +#endif // CPU(64BIT)
|
|
|
| uint32_t m_encoded;
|
| };
|
| @@ -840,8 +849,8 @@ NO_SANITIZE_ADDRESS inline size_t HeapObjectHeader::size() const {
|
|
|
| NO_SANITIZE_ADDRESS inline void HeapObjectHeader::checkHeader() const {
|
| #if CPU(64BIT)
|
| - const bool good = getMagic() == m_magic;
|
| - DCHECK(good);
|
| + const bool goodMagic = getMagic() == m_magic;
|
| + DCHECK(goodMagic);
|
| #endif
|
| }
|
|
|
| @@ -854,6 +863,7 @@ inline Address HeapObjectHeader::payloadEnd() {
|
| }
|
|
|
| NO_SANITIZE_ADDRESS inline size_t HeapObjectHeader::payloadSize() {
|
| + checkHeader();
|
| size_t size = m_encoded & headerSizeMask;
|
| if (UNLIKELY(size == largeObjectSizeInHeader)) {
|
| ASSERT(pageFromObject(this)->isLargeObjectPage());
|
| @@ -871,6 +881,10 @@ inline HeapObjectHeader* HeapObjectHeader::fromPayload(const void* payload) {
|
| return header;
|
| }
|
|
|
| +inline void HeapObjectHeader::checkFromPayload(const void* payload) {
|
| + (void)fromPayload(payload);
|
| +}
|
| +
|
| #if CPU(64BIT)
|
| ALWAYS_INLINE uint32_t RotateLeft16(uint32_t x) {
|
| #if COMPILER(MSVC)
|
|
|