| Index: Source/platform/heap/Handle.h | 
| diff --git a/Source/platform/heap/Handle.h b/Source/platform/heap/Handle.h | 
| index 33adc3bf1032d653afcba8a7788575e7bc4a7fb0..842c87f881236ba5dd229a3b1351f85d47066d8d 100644 | 
| --- a/Source/platform/heap/Handle.h | 
| +++ b/Source/platform/heap/Handle.h | 
| @@ -137,11 +137,11 @@ public: | 
| RawPtr<T> release() | 
| { | 
| RawPtr<T> result = m_raw; | 
| -        m_raw = nullptr; | 
| +        assign(nullptr); | 
| return result; | 
| } | 
|  | 
| -    void clear() { m_raw = nullptr; } | 
| +    void clear() { assign(nullptr); } | 
| T& operator*() const { return *m_raw; } | 
| bool operator!() const { return !m_raw; } | 
| operator T*() const { return m_raw; } | 
| @@ -152,58 +152,67 @@ public: | 
| template<typename U> | 
| PersistentBase& operator=(U* other) | 
| { | 
| -        m_raw = other; | 
| -        checkPointer(); | 
| -        recordBacktrace(); | 
| +        assign(other); | 
| return *this; | 
| } | 
|  | 
| PersistentBase& operator=(std::nullptr_t) | 
| { | 
| -        m_raw = nullptr; | 
| +        assign(nullptr); | 
| return *this; | 
| } | 
|  | 
| PersistentBase& operator=(const PersistentBase& other) | 
| { | 
| -        m_raw = other; | 
| -        checkPointer(); | 
| -        recordBacktrace(); | 
| +        assign(other); | 
| return *this; | 
| } | 
|  | 
| template<typename U> | 
| PersistentBase& operator=(const PersistentBase<U, weaknessConfiguration, crossThreadnessConfiguration>& other) | 
| { | 
| -        m_raw = other; | 
| -        checkPointer(); | 
| -        recordBacktrace(); | 
| +        assign(other); | 
| return *this; | 
| } | 
|  | 
| template<typename U> | 
| PersistentBase& operator=(const Member<U>& other) | 
| { | 
| -        m_raw = other; | 
| -        checkPointer(); | 
| -        recordBacktrace(); | 
| +        assign(other); | 
| return *this; | 
| } | 
|  | 
| template<typename U> | 
| PersistentBase& operator=(const RawPtr<U>& other) | 
| { | 
| -        m_raw = other; | 
| -        checkPointer(); | 
| -        recordBacktrace(); | 
| +        assign(other); | 
| return *this; | 
| } | 
|  | 
|  | 
| private: | 
| NO_LAZY_SWEEP_SANITIZE_ADDRESS | 
| +    void assign(T* ptr) | 
| +    { | 
| +        m_raw = ptr; | 
| +        checkPointer(); | 
| +        recordBacktrace(); | 
| +        if (m_raw) { | 
| +            if (!m_persistentNode) | 
| +                initialize(); | 
| +            return; | 
| +        } | 
| +        if (m_persistentNode && crossThreadnessConfiguration != CrossThreadPersistentConfiguration) | 
| +            uninitialize(); | 
| +    } | 
| + | 
| +    NO_LAZY_SWEEP_SANITIZE_ADDRESS | 
| void initialize() | 
| { | 
| +        ASSERT(!m_persistentNode); | 
| +        if (!m_raw) | 
| +            return; | 
| + | 
| TraceCallback traceCallback = TraceMethodDelegate<PersistentBase<T, weaknessConfiguration, crossThreadnessConfiguration>, &PersistentBase<T, weaknessConfiguration, crossThreadnessConfiguration>::trace>::trampoline; | 
| if (crossThreadnessConfiguration == CrossThreadPersistentConfiguration) { | 
| m_persistentNode = ThreadState::crossThreadPersistentRegion().allocatePersistentNode(this, traceCallback); | 
| @@ -219,6 +228,9 @@ private: | 
|  | 
| void uninitialize() | 
| { | 
| +        if (!m_persistentNode) | 
| +            return; | 
| + | 
| if (crossThreadnessConfiguration == CrossThreadPersistentConfiguration) { | 
| ThreadState::crossThreadPersistentRegion().freePersistentNode(m_persistentNode); | 
| } else { | 
| @@ -228,6 +240,7 @@ private: | 
| ASSERT(m_state == state); | 
| state->persistentRegion()->freePersistentNode(m_persistentNode); | 
| } | 
| +        m_persistentNode = nullptr; | 
| } | 
|  | 
| void checkPointer() | 
| @@ -261,9 +274,9 @@ private: | 
| #endif | 
| // m_raw is accessed most, so put it at the first field. | 
| T* m_raw; | 
| -    PersistentNode* m_persistentNode; | 
| +    PersistentNode* m_persistentNode = nullptr; | 
| #if ENABLE(ASSERT) | 
| -    ThreadState* m_state; | 
| +    ThreadState* m_state = nullptr; | 
| #endif | 
| }; | 
|  | 
|  |