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