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