// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef STACK_ALLOCATED_H_
#define STACK_ALLOCATED_H_

#include "heap/stubs.h"

namespace blink {

class HeapObject;

class PartObject {
    DISALLOW_NEW();
private:
    Member<HeapObject> m_obj; // Needs tracing.
};

class StackObject {
    STACK_ALLOCATED();

    // Redundant trace() method, warning/error expected.
    void Trace(Visitor* visitor) { visitor->Trace(m_obj); }

private:
    Member<HeapObject> m_obj; // Does not need tracing.
};

class HeapObject : public GarbageCollected<HeapObject> {
public:
    void Trace(Visitor*);
private:
    StackObject m_part; // Cannot embed a stack allocated object.
};

// Cannot derive from both heap- and stack-allocated objects.
class DerivedHeapObject : public HeapObject, public StackObject {
};

// Cannot be stack-allocated and derive from a heap-allocated object.
class DerivedHeapObject2 : public HeapObject {
  STACK_ALLOCATED();
};

// STACK_ALLOCATED is inherited.
class DerivedStackObject : public StackObject {
private:
    StackObject m_anotherPart; // Also fine.
};

}

#endif