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