1ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* 2ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru****************************************************************************** 3ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* 454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius* Copyright (C) 2002-2012, International Business Machines 5ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* Corporation and others. All Rights Reserved. 6ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* 7ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru****************************************************************************** 8ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* file name: uobject.h 9ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* encoding: US-ASCII 10ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* tab size: 8 (not used) 11ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* indentation:4 12ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* 13ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* created on: 2002jun26 14ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* created by: Markus W. Scherer 15ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*/ 16ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 17ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/uobject.h" 18ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "cmemory.h" 19ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 20ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_NAMESPACE_BEGIN 21ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 22ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if U_OVERRIDE_CXX_ALLOCATION 23ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 24ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* 25ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Default implementation of UMemory::new/delete 26ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * using uprv_malloc() and uprv_free(). 27ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 28ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * For testing, this is used together with a list of imported symbols to verify 29ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * that ICU is not using the global ::new and ::delete operators. 30ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 31ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * These operators can be implemented like this or any other appropriate way 32ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * when customizing ICU for certain environments. 33ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Whenever ICU is customized in binary incompatible ways please be sure 34ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * to use library name suffixes to distinguish such libraries from 35ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * the standard build. 36ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 37ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Instead of just modifying these C++ new/delete operators, it is usually best 38ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * to modify the uprv_malloc()/uprv_free()/uprv_realloc() functions in cmemory.c. 39ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 40ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Memory test on Windows/MSVC 6: 41ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * The global operators new and delete look as follows: 42ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 04F 00000000 UNDEF notype () External | ??2@YAPAXI@Z (void * __cdecl operator new(unsigned int)) 43ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 03F 00000000 UNDEF notype () External | ??3@YAXPAX@Z (void __cdecl operator delete(void *)) 44ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 45ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * These lines are from output generated by the MSVC 6 tool dumpbin with 46ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * dumpbin /symbols *.obj 47ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 48ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * ??2@YAPAXI@Z and ??3@YAXPAX@Z are the linker symbols in the .obj 49ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * files and are imported from msvcrtd.dll (in a debug build). 50ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 51ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Make sure that with the UMemory operators new and delete defined these two symbols 52ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * do not appear in the dumpbin /symbols output for the ICU libraries! 53ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 54ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * If such a symbol appears in the output then look in the preceding lines in the output 55ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * for which file and function calls the global new or delete operator, 56ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * and replace with uprv_malloc/uprv_free. 57ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 58ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 5985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hovoid * U_EXPORT2 UMemory::operator new(size_t size) U_NO_THROW { 60ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return uprv_malloc(size); 61ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 62ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 6385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hovoid U_EXPORT2 UMemory::operator delete(void *p) U_NO_THROW { 64ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(p!=NULL) { 65ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru uprv_free(p); 66ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 67ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 68ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 6985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hovoid * U_EXPORT2 UMemory::operator new[](size_t size) U_NO_THROW { 70ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return uprv_malloc(size); 71ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 72ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 7385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hovoid U_EXPORT2 UMemory::operator delete[](void *p) U_NO_THROW { 74ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(p!=NULL) { 75ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru uprv_free(p); 76ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 77ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 78ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 79ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if U_HAVE_DEBUG_LOCATION_NEW 8085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hovoid * U_EXPORT2 UMemory::operator new(size_t size, const char* /*file*/, int /*line*/) U_NO_THROW { 81ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return UMemory::operator new(size); 82ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 83ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 8485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hovoid U_EXPORT2 UMemory::operator delete(void* p, const char* /*file*/, int /*line*/) U_NO_THROW { 85ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UMemory::operator delete(p); 86ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 87ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif /* U_HAVE_DEBUG_LOCATION_NEW */ 88ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 89ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 90ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif 91ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 92ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUObject::~UObject() {} 93ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 94f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig CorneliusUClassID UObject::getDynamicClassID() const { return NULL; } 95ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 96ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_NAMESPACE_END 97ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 98103e9ffba2cba345d0078eb8b8db33249f81840aCraig CorneliusU_NAMESPACE_USE 99ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 100103e9ffba2cba345d0078eb8b8db33249f81840aCraig CorneliusU_CAPI void U_EXPORT2 101103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusuprv_deleteUObject(void *obj) { 10254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius delete static_cast<UObject *>(obj); 103103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius} 104