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 STACK_ALLOCATED_H_ 6 #define STACK_ALLOCATED_H_ 7 8 #include "heap/stubs.h" 9 10 namespace blink { 11 12 class HeapObject; 13 14 class PartObject { 15 DISALLOW_NEW(); 16 private: 17 Member<HeapObject> m_obj; // Needs tracing. 18 }; 19 20 class StackObject { 21 STACK_ALLOCATED(); 22 23 // Redundant trace() method, warning/error expected. Trace(Visitor * visitor)24 void Trace(Visitor* visitor) { visitor->Trace(m_obj); } 25 26 private: 27 Member<HeapObject> m_obj; // Does not need tracing. 28 }; 29 30 class HeapObject : public GarbageCollected<HeapObject> { 31 public: 32 void Trace(Visitor*); 33 private: 34 StackObject m_part; // Cannot embed a stack allocated object. 35 }; 36 37 // Cannot derive from both heap- and stack-allocated objects. 38 class DerivedHeapObject : public HeapObject, public StackObject { 39 }; 40 41 // Cannot be stack-allocated and derive from a heap-allocated object. 42 class DerivedHeapObject2 : public HeapObject { 43 STACK_ALLOCATED(); 44 }; 45 46 // STACK_ALLOCATED is inherited. 47 class DerivedStackObject : public StackObject { 48 private: 49 StackObject m_anotherPart; // Also fine. 50 }; 51 52 } 53 54 #endif 55