xref: /aosp_15_r20/external/lzma/CPP/Common/NewHandler.h (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // Common/NewHandler.h
2*f6dc9357SAndroid Build Coastguard Worker 
3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_COMMON_NEW_HANDLER_H
4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_COMMON_NEW_HANDLER_H
5*f6dc9357SAndroid Build Coastguard Worker 
6*f6dc9357SAndroid Build Coastguard Worker /*
7*f6dc9357SAndroid Build Coastguard Worker NewHandler.h and NewHandler.cpp allows to solve problem with compilers that
8*f6dc9357SAndroid Build Coastguard Worker don't throw exception in operator new().
9*f6dc9357SAndroid Build Coastguard Worker 
10*f6dc9357SAndroid Build Coastguard Worker This file must be included before any code that uses operators new() or delete()
11*f6dc9357SAndroid Build Coastguard Worker and you must compile and link "NewHandler.cpp", if you use some old MSVC compiler.
12*f6dc9357SAndroid Build Coastguard Worker 
13*f6dc9357SAndroid Build Coastguard Worker DOCs:
14*f6dc9357SAndroid Build Coastguard Worker   Since ISO C++98, operator new throws std::bad_alloc when memory allocation fails.
15*f6dc9357SAndroid Build Coastguard Worker   MSVC 6.0 returned a null pointer on an allocation failure.
16*f6dc9357SAndroid Build Coastguard Worker   Beginning in VS2002, operator new conforms to the standard and throws on failure.
17*f6dc9357SAndroid Build Coastguard Worker 
18*f6dc9357SAndroid Build Coastguard Worker   By default, the compiler also generates defensive null checks to prevent
19*f6dc9357SAndroid Build Coastguard Worker   these older-style allocators from causing an immediate crash on failure.
20*f6dc9357SAndroid Build Coastguard Worker   The /Zc:throwingNew option tells the compiler to leave out these null checks,
21*f6dc9357SAndroid Build Coastguard Worker   on the assumption that all linked memory allocators conform to the standard.
22*f6dc9357SAndroid Build Coastguard Worker 
23*f6dc9357SAndroid Build Coastguard Worker The operator new() in some MSVC versions doesn't throw exception std::bad_alloc.
24*f6dc9357SAndroid Build Coastguard Worker MSVC 6.0 (_MSC_VER == 1200) doesn't throw exception.
25*f6dc9357SAndroid Build Coastguard Worker The code produced by some another MSVC compilers also can be linked
26*f6dc9357SAndroid Build Coastguard Worker to library that doesn't throw exception.
27*f6dc9357SAndroid Build Coastguard Worker We suppose that code compiled with VS2015+ (_MSC_VER >= 1900) throws exception std::bad_alloc.
28*f6dc9357SAndroid Build Coastguard Worker For older _MSC_VER versions we redefine operator new() and operator delete().
29*f6dc9357SAndroid Build Coastguard Worker Our version of operator new() throws CNewException() exception on failure.
30*f6dc9357SAndroid Build Coastguard Worker 
31*f6dc9357SAndroid Build Coastguard Worker It's still allowed to use redefined version of operator new() from "NewHandler.cpp"
32*f6dc9357SAndroid Build Coastguard Worker with any compiler. 7-Zip's code can work with std::bad_alloc and CNewException() exceptions.
33*f6dc9357SAndroid Build Coastguard Worker But if you use some additional code (outside of 7-Zip's code), you must check
34*f6dc9357SAndroid Build Coastguard Worker that redefined version of operator new() is not problem for your code.
35*f6dc9357SAndroid Build Coastguard Worker */
36*f6dc9357SAndroid Build Coastguard Worker 
37*f6dc9357SAndroid Build Coastguard Worker #include <stddef.h>
38*f6dc9357SAndroid Build Coastguard Worker 
39*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32
40*f6dc9357SAndroid Build Coastguard Worker // We can compile my_new and my_delete with _fastcall
41*f6dc9357SAndroid Build Coastguard Worker /*
42*f6dc9357SAndroid Build Coastguard Worker void * my_new(size_t size);
43*f6dc9357SAndroid Build Coastguard Worker void my_delete(void *p) throw();
44*f6dc9357SAndroid Build Coastguard Worker // void * my_Realloc(void *p, size_t newSize, size_t oldSize);
45*f6dc9357SAndroid Build Coastguard Worker */
46*f6dc9357SAndroid Build Coastguard Worker #endif
47*f6dc9357SAndroid Build Coastguard Worker 
48*f6dc9357SAndroid Build Coastguard Worker 
49*f6dc9357SAndroid Build Coastguard Worker #if defined(_MSC_VER) && (_MSC_VER < 1600)
50*f6dc9357SAndroid Build Coastguard Worker   // If you want to use default operator new(), you can disable the following line
51*f6dc9357SAndroid Build Coastguard Worker   #define Z7_REDEFINE_OPERATOR_NEW
52*f6dc9357SAndroid Build Coastguard Worker #endif
53*f6dc9357SAndroid Build Coastguard Worker 
54*f6dc9357SAndroid Build Coastguard Worker 
55*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_REDEFINE_OPERATOR_NEW
56*f6dc9357SAndroid Build Coastguard Worker 
57*f6dc9357SAndroid Build Coastguard Worker // std::bad_alloc can require additional DLL dependency.
58*f6dc9357SAndroid Build Coastguard Worker // So we don't define CNewException as std::bad_alloc here.
59*f6dc9357SAndroid Build Coastguard Worker 
60*f6dc9357SAndroid Build Coastguard Worker class CNewException {};
61*f6dc9357SAndroid Build Coastguard Worker 
62*f6dc9357SAndroid Build Coastguard Worker void *
63*f6dc9357SAndroid Build Coastguard Worker #ifdef _MSC_VER
64*f6dc9357SAndroid Build Coastguard Worker __cdecl
65*f6dc9357SAndroid Build Coastguard Worker #endif
66*f6dc9357SAndroid Build Coastguard Worker operator new(size_t size);
67*f6dc9357SAndroid Build Coastguard Worker 
68*f6dc9357SAndroid Build Coastguard Worker /*
69*f6dc9357SAndroid Build Coastguard Worker #if 0 && defined(_MSC_VER) && _MSC_VER == 1600
70*f6dc9357SAndroid Build Coastguard Worker   #define Z7_OPERATOR_DELETE_SPEC_THROW0
71*f6dc9357SAndroid Build Coastguard Worker #else
72*f6dc9357SAndroid Build Coastguard Worker   #define Z7_OPERATOR_DELETE_SPEC_THROW0 throw()
73*f6dc9357SAndroid Build Coastguard Worker #endif
74*f6dc9357SAndroid Build Coastguard Worker */
75*f6dc9357SAndroid Build Coastguard Worker #if defined(_MSC_VER) && _MSC_VER == 1600
76*f6dc9357SAndroid Build Coastguard Worker #pragma warning(push)
77*f6dc9357SAndroid Build Coastguard Worker #pragma warning(disable : 4986) // 'operator delete': exception specification does not match previous declaration
78*f6dc9357SAndroid Build Coastguard Worker #endif
79*f6dc9357SAndroid Build Coastguard Worker 
80*f6dc9357SAndroid Build Coastguard Worker void
81*f6dc9357SAndroid Build Coastguard Worker #ifdef _MSC_VER
82*f6dc9357SAndroid Build Coastguard Worker __cdecl
83*f6dc9357SAndroid Build Coastguard Worker #endif
84*f6dc9357SAndroid Build Coastguard Worker operator delete(void *p) throw();
85*f6dc9357SAndroid Build Coastguard Worker 
86*f6dc9357SAndroid Build Coastguard Worker void
87*f6dc9357SAndroid Build Coastguard Worker #ifdef _MSC_VER
88*f6dc9357SAndroid Build Coastguard Worker __cdecl
89*f6dc9357SAndroid Build Coastguard Worker #endif
90*f6dc9357SAndroid Build Coastguard Worker operator delete(void *p, size_t n) throw();
91*f6dc9357SAndroid Build Coastguard Worker 
92*f6dc9357SAndroid Build Coastguard Worker #if defined(_MSC_VER) && _MSC_VER == 1600
93*f6dc9357SAndroid Build Coastguard Worker #pragma warning(pop)
94*f6dc9357SAndroid Build Coastguard Worker #endif
95*f6dc9357SAndroid Build Coastguard Worker 
96*f6dc9357SAndroid Build Coastguard Worker 
97*f6dc9357SAndroid Build Coastguard Worker #else
98*f6dc9357SAndroid Build Coastguard Worker 
99*f6dc9357SAndroid Build Coastguard Worker #include <new>
100*f6dc9357SAndroid Build Coastguard Worker 
101*f6dc9357SAndroid Build Coastguard Worker #define CNewException std::bad_alloc
102*f6dc9357SAndroid Build Coastguard Worker 
103*f6dc9357SAndroid Build Coastguard Worker #endif
104*f6dc9357SAndroid Build Coastguard Worker 
105*f6dc9357SAndroid Build Coastguard Worker /*
106*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32
107*f6dc9357SAndroid Build Coastguard Worker void *
108*f6dc9357SAndroid Build Coastguard Worker #ifdef _MSC_VER
109*f6dc9357SAndroid Build Coastguard Worker __cdecl
110*f6dc9357SAndroid Build Coastguard Worker #endif
111*f6dc9357SAndroid Build Coastguard Worker operator new[](size_t size);
112*f6dc9357SAndroid Build Coastguard Worker 
113*f6dc9357SAndroid Build Coastguard Worker void
114*f6dc9357SAndroid Build Coastguard Worker #ifdef _MSC_VER
115*f6dc9357SAndroid Build Coastguard Worker __cdecl
116*f6dc9357SAndroid Build Coastguard Worker #endif
117*f6dc9357SAndroid Build Coastguard Worker operator delete[](void *p) throw();
118*f6dc9357SAndroid Build Coastguard Worker #endif
119*f6dc9357SAndroid Build Coastguard Worker */
120*f6dc9357SAndroid Build Coastguard Worker 
121*f6dc9357SAndroid Build Coastguard Worker #endif
122