1659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org// Copyright 2012 the V8 project authors. All rights reserved. 243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Redistribution and use in source and binary forms, with or without 343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// modification, are permitted provided that the following conditions are 443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// met: 543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// 643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// * Redistributions of source code must retain the above copyright 743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// notice, this list of conditions and the following disclaimer. 843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// * Redistributions in binary form must reproduce the above 943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// copyright notice, this list of conditions and the following 1043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// disclaimer in the documentation and/or other materials provided 1143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// with the distribution. 1243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// * Neither the name of Google Inc. nor the names of its 1343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// contributors may be used to endorse or promote products derived 1443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// from this software without specific prior written permission. 1543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// 1643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#ifndef V8_ALLOCATION_H_ 2943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#define V8_ALLOCATION_H_ 3043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 315f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org#include "globals.h" 325f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org 3371affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace v8 { 3471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace internal { 3543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 364a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com// Called when allocation routines fail to allocate. 374a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com// This function should not return, but should terminate the current 384a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com// processing. 394a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.comvoid FatalProcessOutOfMemory(const char* message); 4043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 4143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Superclass for classes managed with new & delete. 4243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass Malloced { 4343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 4443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void* operator new(size_t size) { return New(size); } 4543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void operator delete(void* p) { Delete(p); } 4643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 4743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static void FatalProcessOutOfMemory(); 4843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static void* New(size_t size); 4943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static void Delete(void* p); 5043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 5143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 5243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 5343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// A macro is used for defining the base class used for embedded instances. 5443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// The reason is some compilers allocate a minimum of one word for the 5543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// superclass. The macro prevents the use of new & delete in debug mode. 5643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// In release mode we are not willing to pay this overhead. 5743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 5843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#ifdef DEBUG 5943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Superclass for classes with instances allocated inside stack 6043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// activations or inside other objects. 6143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass Embedded { 6243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 6343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void* operator new(size_t size); 6443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void operator delete(void* p); 6543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 6643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#define BASE_EMBEDDED : public Embedded 6743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#else 6843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#define BASE_EMBEDDED 6943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#endif 7043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 7143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 7243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Superclass for classes only using statics. 7343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass AllStatic { 7443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#ifdef DEBUG 7543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 7643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void* operator new(size_t size); 7743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void operator delete(void* p); 7843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#endif 7943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 8043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 8143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 8243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansentemplate <typename T> 834efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.orgT* NewArray(size_t size) { 8443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen T* result = new T[size]; 8543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (result == NULL) Malloced::FatalProcessOutOfMemory(); 8643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return result; 8743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 8843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 8943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 9043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansentemplate <typename T> 911b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.orgvoid DeleteArray(T* array) { 9243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen delete[] array; 9343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 9443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 9543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 96bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org// The normal strdup functions use malloc. These versions of StrDup 97bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org// and StrNDup uses new and calls the FatalProcessOutOfMemory handler 98bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org// if allocation fails. 9943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenchar* StrDup(const char* str); 10001beca7f8d9f549e04ec575a0bca96d859ab55a5ager@chromium.orgchar* StrNDup(const char* str, int n); 10143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 10243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 10343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Allocation policy for allocating in the C free store using malloc 10443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// and free. Used as the default policy for lists. 10543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass FreeStoreAllocationPolicy { 10643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 107400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.org INLINE(void* New(size_t size)) { return Malloced::New(size); } 10843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen INLINE(static void Delete(void* p)) { Malloced::Delete(p); } 10943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 11043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 11143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 11243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Allocation policy for allocating in preallocated space. 11343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Used as an allocation policy for ScopeInfo when generating 11443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// stack traces. 115ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgclass PreallocatedStorage { 11643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 11743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen explicit PreallocatedStorage(size_t size); 11843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen size_t size() { return size_; } 11943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 12043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 12143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen size_t size_; 12243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen PreallocatedStorage* previous_; 12343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen PreallocatedStorage* next_; 12443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 12543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void LinkTo(PreallocatedStorage* other); 12643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void Unlink(); 127ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 128ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org friend class Isolate; 129ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 13043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DISALLOW_IMPLICIT_CONSTRUCTORS(PreallocatedStorage); 13143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 13243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 13343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 134400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.orgstruct PreallocatedStorageAllocationPolicy { 135400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.org INLINE(void* New(size_t size)); 136400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.org INLINE(static void Delete(void* ptr)); 137400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.org}; 138400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.org 139400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.org 14043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} } // namespace v8::internal 14143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 14243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#endif // V8_ALLOCATION_H_ 143