1// Copyright 2014 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#ifndef FINALIZE_AFTER_DISPATCH_H_ 6#define FINALIZE_AFTER_DISPATCH_H_ 7 8#include "heap/stubs.h" 9 10namespace blink { 11 12class NeedsFinalize : public GarbageCollectedFinalized<NeedsFinalize> { 13public: 14 void Trace(Visitor*); 15 void TraceAfterDispatch(Visitor*); 16 // Needs a FinalizeGarbageCollectedObject method. 17}; 18 19class NeedsDispatch : public GarbageCollectedFinalized<NeedsDispatch> { 20public: 21 void Trace(Visitor*); 22 // Needs a TraceAfterDispatch method. 23 void FinalizeGarbageCollectedObject() { }; 24}; 25 26class NeedsFinalizedBase : public GarbageCollected<NeedsFinalizedBase> { 27public: 28 void Trace(Visitor*) { }; 29 void TraceAfterDispatch(Visitor*) { }; 30 void FinalizeGarbageCollectedObject() { }; 31}; 32 33class A : GarbageCollectedFinalized<A> { 34public: 35 void Trace(Visitor*); 36 void TraceAfterDispatch(Visitor*); 37 void FinalizeGarbageCollectedObject(); 38protected: 39 enum Type { TB, TC, TD }; 40 A(Type type) : m_type(type) { } 41private: 42 Type m_type; 43}; 44 45class B : public A { 46public: 47 B() : A(TB) { } 48 ~B() { } 49 void TraceAfterDispatch(Visitor*); 50private: 51 Member<A> m_a; 52}; 53 54class C : public A { 55public: 56 C() : A(TC) { } 57 void TraceAfterDispatch(Visitor*); 58private: 59 Member<A> m_a; 60}; 61 62// This class is considered abstract does not need to be dispatched to. 63class Abstract : public A { 64protected: 65 Abstract(Type type) : A(type) { } 66}; 67 68class D : public Abstract { 69public: 70 D() : Abstract(TD) { } 71 void TraceAfterDispatch(Visitor*); 72private: 73 Member<A> m_a; 74}; 75 76} 77 78#endif 79