| Index: third_party/WebKit/Source/platform/heap/Persistent.h
|
| diff --git a/third_party/WebKit/Source/platform/heap/Persistent.h b/third_party/WebKit/Source/platform/heap/Persistent.h
|
| index 8aa3708af2df13521feaaa734413965cde3ac299..62ae0943988b600eeec328b449920b31dc98c31e 100644
|
| --- a/third_party/WebKit/Source/platform/heap/Persistent.h
|
| +++ b/third_party/WebKit/Source/platform/heap/Persistent.h
|
| @@ -77,12 +77,20 @@ public:
|
| checkPointer();
|
| }
|
|
|
| + PersistentBase(WTF::HashTableDeletedValueType) : m_raw(reinterpret_cast<T*>(-1))
|
| + {
|
| + initialize();
|
| + checkPointer();
|
| + }
|
| +
|
| ~PersistentBase()
|
| {
|
| uninitialize();
|
| m_raw = nullptr;
|
| }
|
|
|
| + bool isHashTableDeletedValue() const { return m_raw == reinterpret_cast<T*>(-1); }
|
| +
|
| template<typename VisitorDispatcher>
|
| void trace(VisitorDispatcher visitor)
|
| {
|
| @@ -184,7 +192,7 @@ private:
|
| void initialize()
|
| {
|
| ASSERT(!m_persistentNode);
|
| - if (!m_raw)
|
| + if (!m_raw || isHashTableDeletedValue())
|
| return;
|
|
|
| TraceCallback traceCallback = TraceMethodDelegate<PersistentBase<T, weaknessConfiguration, crossThreadnessConfiguration>, &PersistentBase<T, weaknessConfiguration, crossThreadnessConfiguration>::trace>::trampoline;
|
| @@ -221,7 +229,7 @@ private:
|
| void checkPointer()
|
| {
|
| #if ENABLE(ASSERT) && defined(ADDRESS_SANITIZER)
|
| - if (!m_raw)
|
| + if (!m_raw || isHashTableDeletedValue())
|
| return;
|
|
|
| // ThreadHeap::isHeapObjectAlive(m_raw) checks that m_raw is a traceable
|
| @@ -263,6 +271,7 @@ public:
|
| Persistent(const Persistent<U>& other) : Parent(other) { }
|
| template<typename U>
|
| Persistent(const Member<U>& other) : Parent(other) { }
|
| + Persistent(WTF::HashTableDeletedValueType x) : Parent(x) { }
|
|
|
| template<typename U>
|
| Persistent& operator=(U* other)
|
| @@ -372,6 +381,7 @@ public:
|
| CrossThreadPersistent(const CrossThreadPersistent<U>& other) : Parent(other) { }
|
| template<typename U>
|
| CrossThreadPersistent(const Member<U>& other) : Parent(other) { }
|
| + CrossThreadPersistent(WTF::HashTableDeletedValueType x) : Parent(x) { }
|
|
|
| T* atomicGet() { return Parent::atomicGet(); }
|
|
|
| @@ -682,6 +692,28 @@ template<typename T, typename U> inline bool operator!=(const Persistent<T>& a,
|
|
|
| namespace WTF {
|
|
|
| +template <typename T>
|
| +struct PersistentHash : MemberHash<T> {
|
| + STATIC_ONLY(PersistentHash);
|
| +};
|
| +
|
| +template <typename T>
|
| +struct CrossThreadPersistentHash : MemberHash<T> {
|
| + STATIC_ONLY(CrossThreadPersistentHash);
|
| +};
|
| +
|
| +template <typename T>
|
| +struct DefaultHash<blink::Persistent<T>> {
|
| + STATIC_ONLY(DefaultHash);
|
| + using Hash = PersistentHash<T>;
|
| +};
|
| +
|
| +template <typename T>
|
| +struct DefaultHash<blink::CrossThreadPersistent<T>> {
|
| + STATIC_ONLY(DefaultHash);
|
| + using Hash = CrossThreadPersistentHash<T>;
|
| +};
|
| +
|
| template<typename T>
|
| struct ParamStorageTraits<blink::WeakPersistentThisPointer<T>> {
|
| STATIC_ONLY(ParamStorageTraits);
|
|
|