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