13ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Copyright 2012 the V8 project authors. All rights reserved. 2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// found in the LICENSE file. 4b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/allocation.h" 63ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 73ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#include <stdlib.h> // For free, malloc. 8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/base/bits.h" 9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/base/logging.h" 10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/base/platform/platform.h" 11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/utils.h" 12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#if V8_LIBC_BIONIC 14b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include <malloc.h> // NOLINT 15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 16a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 17a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace v8 { 18a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace internal { 19a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 20a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid* Malloced::New(size_t size) { 21a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void* result = malloc(size); 228a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang if (result == NULL) { 238a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang v8::internal::FatalProcessOutOfMemory("Malloced operator new"); 248a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang } 25a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return result; 26a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 27a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 28a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 29a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Malloced::Delete(void* p) { 30a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block free(p); 31a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 32a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 33a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 34a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Malloced::FatalProcessOutOfMemory() { 358a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang v8::internal::FatalProcessOutOfMemory("Out of memory"); 36a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 37a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 38a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 39a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifdef DEBUG 40a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 41a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockstatic void* invalid = static_cast<void*>(NULL); 42a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 43a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid* Embedded::operator new(size_t size) { 44a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block UNREACHABLE(); 45a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return invalid; 46a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 47a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 48a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 49a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Embedded::operator delete(void* p) { 50a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block UNREACHABLE(); 51a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 52a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 53a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 54a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid* AllStatic::operator new(size_t size) { 55a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block UNREACHABLE(); 56a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return invalid; 57a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 58a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 59a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 60a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AllStatic::operator delete(void* p) { 61a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block UNREACHABLE(); 62a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 63a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 64a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif 65a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 66a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 67a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockchar* StrDup(const char* str) { 68d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block int length = StrLength(str); 69a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block char* result = NewArray<char>(length + 1); 70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MemCopy(result, str, length); 71a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block result[length] = '\0'; 72a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return result; 73a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 74a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 75a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 76d0582a6c46733687d045e4188a1bcd0123c758a1Steve Blockchar* StrNDup(const char* str, int n) { 77d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block int length = StrLength(str); 78a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (n < length) length = n; 79a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block char* result = NewArray<char>(length + 1); 80b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MemCopy(result, str, length); 81a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block result[length] = '\0'; 82a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return result; 83a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 84a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 85a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 86b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid* AlignedAlloc(size_t size, size_t alignment) { 87b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK_LE(V8_ALIGNOF(void*), alignment); 88b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(base::bits::IsPowerOfTwo32(alignment)); 89b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void* ptr; 90b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#if V8_OS_WIN 91b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ptr = _aligned_malloc(size, alignment); 92b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#elif V8_LIBC_BIONIC 93b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // posix_memalign is not exposed in some Android versions, so we fall back to 94b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // memalign. See http://code.google.com/p/android/issues/detail?id=35391. 95b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ptr = memalign(alignment, size); 96b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#else 97b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (posix_memalign(&ptr, alignment, size)) ptr = NULL; 98b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 99b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (ptr == NULL) FatalProcessOutOfMemory("AlignedAlloc"); 100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ptr; 101a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 102a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 103a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid AlignedFree(void *ptr) { 105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#if V8_OS_WIN 106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch _aligned_free(ptr); 107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#elif V8_LIBC_BIONIC 108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Using free is not correct in general, but for V8_LIBC_BIONIC it is. 109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch free(ptr); 110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#else 111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch free(ptr); 112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 113a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 114a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 115a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} } // namespace v8::internal 116