/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this file, * You can obtain one at http://mozilla.org/MPL/2.0/. */ #include #include "mozmemory_wrap.h" #include "mozilla/Types.h" /* Declare malloc implementation functions with the right return and * argument types. */ #define MALLOC_DECL(name, return_type, ...) \ MOZ_MEMORY_API return_type name ## _impl(__VA_ARGS__); #include "malloc_decls.h" #ifdef MOZ_WRAP_NEW_DELETE /* operator new(unsigned int) */ MOZ_MEMORY_API void * mozmem_malloc_impl(_Znwj)(unsigned int size) { return malloc_impl(size); } /* operator new[](unsigned int) */ MOZ_MEMORY_API void * mozmem_malloc_impl(_Znaj)(unsigned int size) { return malloc_impl(size); } /* operator delete(void*) */ MOZ_MEMORY_API void mozmem_malloc_impl(_ZdlPv)(void *ptr) { free_impl(ptr); } /* operator delete[](void*) */ MOZ_MEMORY_API void mozmem_malloc_impl(_ZdaPv)(void *ptr) { free_impl(ptr); } /*operator new(unsigned int, std::nothrow_t const&)*/ MOZ_MEMORY_API void * mozmem_malloc_impl(_ZnwjRKSt9nothrow_t)(unsigned int size) { return malloc_impl(size); } /*operator new[](unsigned int, std::nothrow_t const&)*/ MOZ_MEMORY_API void * mozmem_malloc_impl(_ZnajRKSt9nothrow_t)(unsigned int size) { return malloc_impl(size); } /* operator delete(void*, std::nothrow_t const&) */ MOZ_MEMORY_API void mozmem_malloc_impl(_ZdlPvRKSt9nothrow_t)(void *ptr) { free_impl(ptr); } /* operator delete[](void*, std::nothrow_t const&) */ MOZ_MEMORY_API void mozmem_malloc_impl(_ZdaPvRKSt9nothrow_t)(void *ptr) { free_impl(ptr); } #endif /* strndup and strdup may be defined as macros in string.h, which would * clash with the definitions below. */ #undef strndup #undef strdup #ifndef XP_DARWIN MOZ_MEMORY_API char * strndup_impl(const char *src, size_t len) { char* dst = (char*) malloc_impl(len + 1); if (dst) { strncpy(dst, src, len); dst[len] = '\0'; } return dst; } MOZ_MEMORY_API char * strdup_impl(const char *src) { size_t len = strlen(src); return strndup_impl(src, len); } #endif /* XP_DARWIN */ #ifdef ANDROID #include #include MOZ_MEMORY_API int vasprintf_impl(char **str, const char *fmt, va_list ap) { char* ptr, *_ptr; int ret; if (str == NULL || fmt == NULL) { return -1; } ptr = (char*)malloc_impl(128); if (ptr == NULL) { *str = NULL; return -1; } ret = vsnprintf(ptr, 128, fmt, ap); if (ret < 0) { free_impl(ptr); *str = NULL; return -1; } _ptr = realloc_impl(ptr, ret + 1); if (_ptr == NULL) { free_impl(ptr); *str = NULL; return -1; } *str = _ptr; return ret; } MOZ_MEMORY_API int asprintf_impl(char **str, const char *fmt, ...) { int ret; va_list ap; va_start(ap, fmt); ret = vasprintf_impl(str, fmt, ap); va_end(ap); return ret; } #endif #ifdef XP_WIN /* * There's a fun allocator mismatch in (at least) the VS 2010 CRT * (see the giant comment in $(topsrcdir)/mozglue/build/Makefile.in) * that gets redirected here to avoid a crash on shutdown. */ void dumb_free_thunk(void *ptr) { return; /* shutdown leaks that we don't care about */ } #include /* * We also need to provide our own impl of wcsdup so that we don't ask * the CRT for memory from its heap (which will then be unfreeable). */ wchar_t * wcsdup_impl(const wchar_t *src) { size_t len = wcslen(src); wchar_t *dst = (wchar_t*) malloc_impl((len + 1) * sizeof(wchar_t)); if (dst) wcsncpy(dst, src, len + 1); return dst; } void * _aligned_malloc(size_t size, size_t alignment) { return memalign_impl(alignment, size); } #endif /* XP_WIN */