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