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