1// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
2// for details. All rights reserved. Use of this source code is governed by a
3// BSD-style license that can be found in the LICENSE file.
4
5#ifndef RUNTIME_VM_ALLOCATION_H_
6#define RUNTIME_VM_ALLOCATION_H_
7
8#include "platform/allocation.h"
9#include "platform/assert.h"
10#include "vm/globals.h"
11
12namespace dart {
13
14// Forward declarations.
15class ThreadState;
16class Zone;
17
18// Stack resources subclass from this base class. The VM will ensure that the
19// destructors of these objects are called before the stack is unwound past the
20// objects location on the stack. Use stack resource objects if objects
21// need to be destroyed even in the case of exceptions when a Longjump is done
22// to a stack frame above the frame where these objects were allocated.
23class StackResource {
24 public:
25 explicit StackResource(ThreadState* thread) : thread_(NULL), previous_(NULL) {
26 Init(thread);
27 }
28
29 virtual ~StackResource();
30
31 // The thread that owns this resource.
32 ThreadState* thread() const { return thread_; }
33
34 // Destroy stack resources of thread until top exit frame.
35 static void Unwind(ThreadState* thread) { UnwindAbove(thread, NULL); }
36 // Destroy stack resources of thread above new_top, exclusive.
37 static void UnwindAbove(ThreadState* thread, StackResource* new_top);
38
39 private:
40 void Init(ThreadState* thread);
41
42 ThreadState* thread_;
43 StackResource* previous_;
44
45 DISALLOW_ALLOCATION();
46 DISALLOW_IMPLICIT_CONSTRUCTORS(StackResource);
47};
48
49// Zone allocated objects cannot be individually deallocated, but have
50// to rely on the destructor of Zone which is called when the Zone
51// goes out of scope to reclaim memory.
52class ZoneAllocated {
53 public:
54 ZoneAllocated() {}
55
56 // Implicitly allocate the object in the current zone.
57 void* operator new(uword size);
58
59 // Allocate the object in the given zone, which must be the current zone.
60 void* operator new(uword size, Zone* zone);
61
62 // Ideally, the delete operator should be protected instead of
63 // public, but unfortunately the compiler sometimes synthesizes
64 // (unused) destructors for classes derived from ZoneObject, which
65 // require the operator to be visible. MSVC requires the delete
66 // operator to be public.
67
68 // Disallow explicit deallocation of nodes. Nodes can only be
69 // deallocated by invoking DeleteAll() on the zone they live in.
70 void operator delete(void* pointer) { UNREACHABLE(); }
71
72 private:
73 DISALLOW_COPY_AND_ASSIGN(ZoneAllocated);
74};
75
76} // namespace dart
77
78#endif // RUNTIME_VM_ALLOCATION_H_
79