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