Home | History | Annotate | Download | only in tests
      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 CLASS_REQUIRES_FINALIZATION_H_
      6 #define CLASS_REQUIRES_FINALIZATION_H_
      7 
      8 #include "heap/stubs.h"
      9 
     10 namespace blink {
     11 
     12 class A : public GarbageCollected<A> {
     13 public:
     14     virtual void trace(Visitor*) { }
     15 };
     16 
     17 // Has a non-trivial dtor (user-declared).
     18 class B {
     19 public:
     20     ~B() { }
     21     void trace(Visitor*) { };
     22 };
     23 
     24 // Has a trivial dtor.
     25 class C {
     26 public:
     27     void trace(Visitor*) { };
     28 };
     29 
     30 } // blink namespace
     31 
     32 namespace WTF {
     33 
     34 template<>
     35 struct VectorTraits<blink::C> {
     36     static const bool needsDestruction = false;
     37 };
     38 
     39 } // WTF namespace
     40 
     41 namespace blink {
     42 
     43 // Off-heap vectors always need to be finalized.
     44 class NeedsFinalizer : public A, public ScriptWrappable {
     45 public:
     46     void trace(Visitor*);
     47 private:
     48     Vector<Member<A> > m_as;
     49 };
     50 
     51 // On-heap vectors with inlined objects that need destruction
     52 // need to be finalized.
     53 class AlsoNeedsFinalizer : public A {
     54 public:
     55     void trace(Visitor*);
     56 private:
     57     HeapVector<B, 10> m_bs;
     58 };
     59 
     60 // On-heap vectors with no inlined objects never need to be finalized.
     61 class DoesNotNeedFinalizer : public A, public ScriptWrappable {
     62 public:
     63     void trace(Visitor*);
     64 private:
     65     HeapVector<B> m_bs;
     66 };
     67 
     68 // On-heap vectors with inlined objects that don't need destruction
     69 // don't need to be finalized.
     70 class AlsoDoesNotNeedFinalizer : public A, public ScriptWrappable {
     71 public:
     72     void trace(Visitor*);
     73 private:
     74     HeapVector<Member<A>, 10> m_as;
     75     HeapVector<C, 10> m_cs;
     76 };
     77 
     78 }
     79 
     80 #endif
     81