1f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 2f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// found in the LICENSE file. 4f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 5f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#ifndef STACK_ALLOCATED_H_ 6f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#define STACK_ALLOCATED_H_ 7f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 8f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include "heap/stubs.h" 9f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 10f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochnamespace blink { 11f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 12f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass HeapObject; 13f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 14f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass PartObject { 15f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch DISALLOW_NEW(); 16f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochprivate: 17f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Member<HeapObject> m_obj; // Needs tracing. 18f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}; 19f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 20f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass StackObject { 21f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch STACK_ALLOCATED(); 22f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochprivate: 23f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Member<HeapObject> m_obj; // Does not need tracing. 24f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}; 25f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 26f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass HeapObject : public GarbageCollected<HeapObject> { 27f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochpublic: 28f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch void trace(Visitor*); 29f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochprivate: 30f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch StackObject m_part; // Cannot embed a stack allocated object. 31f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}; 32f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 33f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Cannot derive from both heap- and stack-allocated objects. 34f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass DerivedHeapObject : public HeapObject, public StackObject { 35f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}; 36f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 37f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Cannot be stack-allocated and derive from a heap-allocated object. 38f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass DerivedHeapObject2 : public HeapObject { 39f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch STACK_ALLOCATED(); 40f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}; 41f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 42f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// STACK_ALLOCATED is inherited. 43f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass DerivedStackObject : public StackObject { 44f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochprivate: 45f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch StackObject m_anotherPart; // Also fine. 46f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}; 47f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 48f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch} 49f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 50f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#endif 51