blob: 75aba35d8cfcf0a4111cda2a8321693eb6372c7b [file] [log] [blame]
ager@chromium.org9258b6b2008-09-11 09:11:10 +00001// Copyright 2008 the V8 project authors. All rights reserved.
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002// Redistribution and use in source and binary forms, with or without
3// modification, are permitted provided that the following conditions are
4// met:
5//
6// * Redistributions of source code must retain the above copyright
7// notice, this list of conditions and the following disclaimer.
8// * Redistributions in binary form must reproduce the above
9// copyright notice, this list of conditions and the following
10// disclaimer in the documentation and/or other materials provided
11// with the distribution.
12// * Neither the name of Google Inc. nor the names of its
13// contributors may be used to endorse or promote products derived
14// from this software without specific prior written permission.
15//
16// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
28#ifndef V8_ALLOCATION_H_
29#define V8_ALLOCATION_H_
30
ager@chromium.org5f0c45f2010-12-17 08:51:21 +000031#include "checks.h"
32#include "globals.h"
33
kasperl@chromium.org71affb52009-05-26 05:44:31 +000034namespace v8 {
35namespace internal {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +000036
erik.corry@gmail.com4a6c3272010-11-18 12:04:40 +000037// Called when allocation routines fail to allocate.
38// This function should not return, but should terminate the current
39// processing.
40void FatalProcessOutOfMemory(const char* message);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +000041
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +000042// Superclass for classes managed with new & delete.
43class Malloced {
44 public:
45 void* operator new(size_t size) { return New(size); }
46 void operator delete(void* p) { Delete(p); }
47
48 static void FatalProcessOutOfMemory();
49 static void* New(size_t size);
50 static void Delete(void* p);
51};
52
53
54// A macro is used for defining the base class used for embedded instances.
55// The reason is some compilers allocate a minimum of one word for the
56// superclass. The macro prevents the use of new & delete in debug mode.
57// In release mode we are not willing to pay this overhead.
58
59#ifdef DEBUG
60// Superclass for classes with instances allocated inside stack
61// activations or inside other objects.
62class Embedded {
63 public:
64 void* operator new(size_t size);
65 void operator delete(void* p);
66};
67#define BASE_EMBEDDED : public Embedded
68#else
69#define BASE_EMBEDDED
70#endif
71
72
73// Superclass for classes only using statics.
74class AllStatic {
75#ifdef DEBUG
76 public:
77 void* operator new(size_t size);
78 void operator delete(void* p);
79#endif
80};
81
82
83template <typename T>
84static T* NewArray(int size) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +000085 T* result = new T[size];
86 if (result == NULL) Malloced::FatalProcessOutOfMemory();
87 return result;
88}
89
90
91template <typename T>
92static void DeleteArray(T* array) {
93 delete[] array;
94}
95
96
ager@chromium.orgbb29dc92009-03-24 13:25:23 +000097// The normal strdup functions use malloc. These versions of StrDup
98// and StrNDup uses new and calls the FatalProcessOutOfMemory handler
99// if allocation fails.
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000100char* StrDup(const char* str);
ager@chromium.org01beca72009-11-24 14:29:16 +0000101char* StrNDup(const char* str, int n);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000102
103
104// Allocation policy for allocating in the C free store using malloc
105// and free. Used as the default policy for lists.
106class FreeStoreAllocationPolicy {
107 public:
108 INLINE(static void* New(size_t size)) { return Malloced::New(size); }
109 INLINE(static void Delete(void* p)) { Malloced::Delete(p); }
110};
111
112
113// Allocation policy for allocating in preallocated space.
114// Used as an allocation policy for ScopeInfo when generating
115// stack traces.
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +0000116class PreallocatedStorage {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000117 public:
118 explicit PreallocatedStorage(size_t size);
119 size_t size() { return size_; }
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000120
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +0000121 // TODO(isolates): Get rid of these-- we'll have to change the allocator
122 // interface to include a pointer to an isolate to do this
123 // efficiently.
124 static inline void* New(size_t size);
125 static inline void Delete(void* p);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000126
127 private:
128 size_t size_;
129 PreallocatedStorage* previous_;
130 PreallocatedStorage* next_;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000131
132 void LinkTo(PreallocatedStorage* other);
133 void Unlink();
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +0000134
135 friend class Isolate;
136
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000137 DISALLOW_IMPLICIT_CONSTRUCTORS(PreallocatedStorage);
138};
139
140
141} } // namespace v8::internal
142
143#endif // V8_ALLOCATION_H_