| Index: third_party/WebKit/Source/platform/heap/ThreadState.h | 
| diff --git a/third_party/WebKit/Source/platform/heap/ThreadState.h b/third_party/WebKit/Source/platform/heap/ThreadState.h | 
| index 6ab0903e33f4eadf0e9522dd9c5c20d40233d7cb..a34732f7fd8565e8453072bbc26501db534c2a91 100644 | 
| --- a/third_party/WebKit/Source/platform/heap/ThreadState.h | 
| +++ b/third_party/WebKit/Source/platform/heap/ThreadState.h | 
| @@ -91,11 +91,6 @@ class Visitor; | 
| // | 
| // class Foo : GarbageCollected<Foo> { | 
| //     USING_PRE_FINALIZER(Foo, dispose); | 
| -// public: | 
| -//     Foo() | 
| -//     { | 
| -//         ThreadState::current()->registerPreFinalizer(this); | 
| -//     } | 
| // private: | 
| //     void dispose() | 
| //     { | 
| @@ -103,15 +98,18 @@ class Visitor; | 
| //     } | 
| //     Member<Bar> m_bar; | 
| // }; | 
| -#define USING_PRE_FINALIZER(Class, preFinalizer)    \ | 
| - public:                                            \ | 
| -  static bool invokePreFinalizer(void* object) {    \ | 
| -    Class* self = reinterpret_cast<Class*>(object); \ | 
| -    if (ThreadHeap::isHeapObjectAlive(self))        \ | 
| -      return false;                                 \ | 
| -    self->Class::preFinalizer();                    \ | 
| -    return true;                                    \ | 
| -  }                                                 \ | 
| +#define USING_PRE_FINALIZER(Class, preFinalizer)                           \ | 
| + public:                                                                   \ | 
| +  static bool invokePreFinalizer(void* object) {                           \ | 
| +    Class* self = reinterpret_cast<Class*>(object);                        \ | 
| +    if (ThreadHeap::isHeapObjectAlive(self))                               \ | 
| +      return false;                                                        \ | 
| +    self->Class::preFinalizer();                                           \ | 
| +    return true;                                                           \ | 
| +  }                                                                        \ | 
| +                                                                           \ | 
| + private:                                                                  \ | 
| +  ThreadState::PrefinalizerRegistration<Class> m_prefinalizerDummy = this; \ | 
| using UsingPreFinalizerMacroNeedsTrailingSemiColon = char | 
|  | 
| class PLATFORM_EXPORT ThreadState { | 
| @@ -415,32 +413,9 @@ class PLATFORM_EXPORT ThreadState { | 
|  | 
| size_t objectPayloadSizeForTesting(); | 
|  | 
| -  // Register the pre-finalizer for the |self| object. This method is normally | 
| -  // called in the constructor of the |self| object. The class T must have | 
| -  // USING_PRE_FINALIZER(). | 
| +  // TODO: no longer needed, remove all uses. | 
| template <typename T> | 
| void registerPreFinalizer(T* self) { | 
| -    static_assert(sizeof(&T::invokePreFinalizer) > 0, | 
| -                  "USING_PRE_FINALIZER(T) must be defined."); | 
| -    ASSERT(checkThread()); | 
| -    ASSERT(!sweepForbidden()); | 
| -    ASSERT(!m_orderedPreFinalizers.contains( | 
| -        PreFinalizer(self, T::invokePreFinalizer))); | 
| -    m_orderedPreFinalizers.add(PreFinalizer(self, T::invokePreFinalizer)); | 
| -  } | 
| - | 
| -  // Unregister the pre-finalizer for the |self| object. | 
| -  template <typename T> | 
| -  void unregisterPreFinalizer(T* self) { | 
| -    static_assert(sizeof(&T::invokePreFinalizer) > 0, | 
| -                  "USING_PRE_FINALIZER(T) must be defined."); | 
| -    ASSERT(checkThread()); | 
| -    // Ignore pre-finalizers called during pre-finalizers or destructors. | 
| -    if (sweepForbidden()) | 
| -      return; | 
| -    ASSERT(m_orderedPreFinalizers.contains( | 
| -        PreFinalizer(self, T::invokePreFinalizer))); | 
| -    m_orderedPreFinalizers.remove(PreFinalizer(self, &T::invokePreFinalizer)); | 
| } | 
|  | 
| void shouldFlushHeapDoesNotContainCache() { | 
| @@ -565,7 +540,29 @@ class PLATFORM_EXPORT ThreadState { | 
| void collectGarbageForTerminatingThread(); | 
| void collectAllGarbage(); | 
|  | 
| +  // Register the pre-finalizer for the |self| object. The class T must have | 
| +  // USING_PRE_FINALIZER(). | 
| +  template <typename T> | 
| +  class PrefinalizerRegistration final { | 
| +   public: | 
| +    PrefinalizerRegistration(T* self) { | 
| +      static_assert(sizeof(&T::invokePreFinalizer) > 0, | 
| +                    "USING_PRE_FINALIZER(T) must be defined."); | 
| +      ThreadState* state = ThreadState::current(); | 
| +#if ENABLE(ASSERT) | 
| +      DCHECK(state->checkThread()); | 
| +#endif | 
| +      DCHECK(!state->sweepForbidden()); | 
| +      DCHECK(!state->m_orderedPreFinalizers.contains( | 
| +          PreFinalizer(self, T::invokePreFinalizer))); | 
| +      state->m_orderedPreFinalizers.add( | 
| +          PreFinalizer(self, T::invokePreFinalizer)); | 
| +    } | 
| +  }; | 
| + | 
| private: | 
| +  template <typename T> | 
| +  friend class PrefinalizerRegistration; | 
| enum SnapshotType { HeapSnapshot, FreelistSnapshot }; | 
|  | 
| explicit ThreadState(BlinkGC::ThreadHeapMode); | 
|  |