polymorphic_class_with_non_virtual_trace.h revision 1320f92c476a1ad9d19dba2a48c72b75566198e9
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 POLYMORPHIC_CLASS_WITH_NON_VIRTUAL_TRACE_H_
6#define POLYMORPHIC_CLASS_WITH_NON_VIRTUAL_TRACE_H_
7
8#include "heap/stubs.h"
9
10namespace blink {
11
12class HeapObject : public GarbageCollected<HeapObject> {
13public:
14    void trace(Visitor*) { }
15};
16
17class NonPolymorphicBase {
18};
19
20class PolymorphicBase {
21public:
22    virtual void foo();
23};
24
25class IsLeftMostPolymorphic
26    : public GarbageCollected<IsLeftMostPolymorphic>,
27      public PolymorphicBase {
28public:
29    void trace(Visitor*);
30private:
31    Member<HeapObject> m_obj;
32};
33
34class IsNotLeftMostPolymorphic
35    : public GarbageCollected<IsNotLeftMostPolymorphic>,
36      public NonPolymorphicBase,
37      public PolymorphicBase {
38public:
39    void trace(Visitor*);
40private:
41    Member<HeapObject> m_obj;
42};
43
44template<typename T>
45class TemplatedNonPolymorphicBase
46    : public GarbageCollected<TemplatedNonPolymorphicBase<T> > {
47public:
48    void trace(Visitor* visitor) { visitor->trace(m_obj); }
49private:
50    Member<HeapObject> m_obj;
51};
52
53// Looks OK, but will result in an incorrect object pointer when marking.
54class TemplatedIsNotLeftMostPolymorphic
55    : public TemplatedNonPolymorphicBase<TemplatedIsNotLeftMostPolymorphic>,
56      public PolymorphicBase {
57};
58
59}
60
61#endif
62