1659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org// Copyright 2012 the V8 project authors. All rights reserved.
23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// Use of this source code is governed by a BSD-style license that can be
33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// found in the LICENSE file.
443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#ifndef V8_ALLOCATION_H_
643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#define V8_ALLOCATION_H_
743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
8196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/globals.h"
95f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org
1071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace v8 {
1171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace internal {
1243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
134a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com// Called when allocation routines fail to allocate.
144a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com// This function should not return, but should terminate the current
154a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com// processing.
164a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.comvoid FatalProcessOutOfMemory(const char* message);
1743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Superclass for classes managed with new & delete.
1943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass Malloced {
2043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
2143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void* operator new(size_t size) { return New(size); }
2243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void  operator delete(void* p) { Delete(p); }
2343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  static void FatalProcessOutOfMemory();
2543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  static void* New(size_t size);
2643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  static void Delete(void* p);
2743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
2843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// A macro is used for defining the base class used for embedded instances.
3143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// The reason is some compilers allocate a minimum of one word for the
3243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// superclass. The macro prevents the use of new & delete in debug mode.
3343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// In release mode we are not willing to pay this overhead.
3443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#ifdef DEBUG
3643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Superclass for classes with instances allocated inside stack
3743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// activations or inside other objects.
3843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass Embedded {
3943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
4043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void* operator new(size_t size);
4143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void  operator delete(void* p);
4243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
4343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#define BASE_EMBEDDED : public Embedded
4443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#else
4543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#define BASE_EMBEDDED
4643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#endif
4743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
4843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
4943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Superclass for classes only using statics.
5043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass AllStatic {
5143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#ifdef DEBUG
5243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
5343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void* operator new(size_t size);
5443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void operator delete(void* p);
5543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#endif
5643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
5743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansentemplate <typename T>
604efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.orgT* NewArray(size_t size) {
6143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  T* result = new T[size];
6243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (result == NULL) Malloced::FatalProcessOutOfMemory();
6343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return result;
6443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
6543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
6643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
6743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansentemplate <typename T>
681b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.orgvoid DeleteArray(T* array) {
6943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  delete[] array;
7043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
7143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
7243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
73bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org// The normal strdup functions use malloc.  These versions of StrDup
74bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org// and StrNDup uses new and calls the FatalProcessOutOfMemory handler
75bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org// if allocation fails.
7643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenchar* StrDup(const char* str);
7701beca7f8d9f549e04ec575a0bca96d859ab55a5ager@chromium.orgchar* StrNDup(const char* str, int n);
7843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
7943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
8043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Allocation policy for allocating in the C free store using malloc
8143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// and free. Used as the default policy for lists.
8243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass FreeStoreAllocationPolicy {
8343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
84400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.org  INLINE(void* New(size_t size)) { return Malloced::New(size); }
8543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  INLINE(static void Delete(void* p)) { Malloced::Delete(p); }
8643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
8743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
8843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
89034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.orgvoid* AlignedAlloc(size_t size, size_t alignment);
90034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.orgvoid AlignedFree(void *ptr);
91034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org
9243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} }  // namespace v8::internal
9343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
9443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#endif  // V8_ALLOCATION_H_
95