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
5196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/allocation.h"
6659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org
7659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org#include <stdlib.h>  // For free, malloc.
821d700eedcdd6570eff22ece724b63a5eefe78cbmachenbach@chromium.org#include "src/base/bits.h"
95de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org#include "src/base/logging.h"
105de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org#include "src/base/platform/platform.h"
11196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/utils.h"
1243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
13034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org#if V8_LIBC_BIONIC
14034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org#include <malloc.h>  // NOLINT
15034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org#endif
16034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org
1771affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace v8 {
1871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace internal {
1943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid* Malloced::New(size_t size) {
2143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void* result = malloc(size);
224a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com  if (result == NULL) {
234a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com    v8::internal::FatalProcessOutOfMemory("Malloced operator new");
244a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com  }
2543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return result;
2643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
2743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Malloced::Delete(void* p) {
3043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  free(p);
3143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
3243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Malloced::FatalProcessOutOfMemory() {
354a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com  v8::internal::FatalProcessOutOfMemory("Out of memory");
3643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
3743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#ifdef DEBUG
4043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
4143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenstatic void* invalid = static_cast<void*>(NULL);
4243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
4343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid* Embedded::operator new(size_t size) {
4443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  UNREACHABLE();
4543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return invalid;
4643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
4743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
4843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
4943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Embedded::operator delete(void* p) {
5043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  UNREACHABLE();
5143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
5243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid* AllStatic::operator new(size_t size) {
5543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  UNREACHABLE();
5643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return invalid;
5743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
5843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
6043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid AllStatic::operator delete(void* p) {
6143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  UNREACHABLE();
6243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
6343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
6443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#endif
6543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
6643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
6743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenchar* StrDup(const char* str) {
68c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  int length = StrLength(str);
6943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  char* result = NewArray<char>(length + 1);
70d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  MemCopy(result, str, length);
7143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  result[length] = '\0';
7243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return result;
7343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
7443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
7543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
76c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.orgchar* StrNDup(const char* str, int n) {
77c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  int length = StrLength(str);
78bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org  if (n < length) length = n;
79bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org  char* result = NewArray<char>(length + 1);
80d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  MemCopy(result, str, length);
81bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org  result[length] = '\0';
82bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org  return result;
83bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org}
84bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org
85034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org
86034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.orgvoid* AlignedAlloc(size_t size, size_t alignment) {
8721d700eedcdd6570eff22ece724b63a5eefe78cbmachenbach@chromium.org  DCHECK_LE(V8_ALIGNOF(void*), alignment);
8821d700eedcdd6570eff22ece724b63a5eefe78cbmachenbach@chromium.org  DCHECK(base::bits::IsPowerOfTwo32(alignment));
89034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org  void* ptr;
90034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org#if V8_OS_WIN
91034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org  ptr = _aligned_malloc(size, alignment);
92034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org#elif V8_LIBC_BIONIC
93034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org  // posix_memalign is not exposed in some Android versions, so we fall back to
94034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org  // memalign. See http://code.google.com/p/android/issues/detail?id=35391.
95034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org  ptr = memalign(alignment, size);
96034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org#else
97034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org  if (posix_memalign(&ptr, alignment, size)) ptr = NULL;
98034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org#endif
99034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org  if (ptr == NULL) FatalProcessOutOfMemory("AlignedAlloc");
100034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org  return ptr;
101034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org}
102034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org
103034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org
104034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.orgvoid AlignedFree(void *ptr) {
105034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org#if V8_OS_WIN
106034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org  _aligned_free(ptr);
107034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org#elif V8_LIBC_BIONIC
108034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org  // Using free is not correct in general, but for V8_LIBC_BIONIC it is.
109034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org  free(ptr);
110034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org#else
111034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org  free(ptr);
112034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org#endif
113034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org}
114034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org
11543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} }  // namespace v8::internal
116