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