chore: initial commit (extracted from Launchers monorepo)
Plugin: ns7zip v2.0.0 Architectures: x86-ansi, x86-unicode, amd64-unicode License: LGPL-2.1-or-later
This commit is contained in:
@@ -0,0 +1,121 @@
|
||||
// Common/NewHandler.h
|
||||
|
||||
#ifndef ZIP7_INC_COMMON_NEW_HANDLER_H
|
||||
#define ZIP7_INC_COMMON_NEW_HANDLER_H
|
||||
|
||||
/*
|
||||
NewHandler.h and NewHandler.cpp allows to solve problem with compilers that
|
||||
don't throw exception in operator new().
|
||||
|
||||
This file must be included before any code that uses operators new() or delete()
|
||||
and you must compile and link "NewHandler.cpp", if you use some old MSVC compiler.
|
||||
|
||||
DOCs:
|
||||
Since ISO C++98, operator new throws std::bad_alloc when memory allocation fails.
|
||||
MSVC 6.0 returned a null pointer on an allocation failure.
|
||||
Beginning in VS2002, operator new conforms to the standard and throws on failure.
|
||||
|
||||
By default, the compiler also generates defensive null checks to prevent
|
||||
these older-style allocators from causing an immediate crash on failure.
|
||||
The /Zc:throwingNew option tells the compiler to leave out these null checks,
|
||||
on the assumption that all linked memory allocators conform to the standard.
|
||||
|
||||
The operator new() in some MSVC versions doesn't throw exception std::bad_alloc.
|
||||
MSVC 6.0 (_MSC_VER == 1200) doesn't throw exception.
|
||||
The code produced by some another MSVC compilers also can be linked
|
||||
to library that doesn't throw exception.
|
||||
We suppose that code compiled with VS2015+ (_MSC_VER >= 1900) throws exception std::bad_alloc.
|
||||
For older _MSC_VER versions we redefine operator new() and operator delete().
|
||||
Our version of operator new() throws CNewException() exception on failure.
|
||||
|
||||
It's still allowed to use redefined version of operator new() from "NewHandler.cpp"
|
||||
with any compiler. 7-Zip's code can work with std::bad_alloc and CNewException() exceptions.
|
||||
But if you use some additional code (outside of 7-Zip's code), you must check
|
||||
that redefined version of operator new() is not problem for your code.
|
||||
*/
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
#ifdef _WIN32
|
||||
// We can compile my_new and my_delete with _fastcall
|
||||
/*
|
||||
void * my_new(size_t size);
|
||||
void my_delete(void *p) throw();
|
||||
// void * my_Realloc(void *p, size_t newSize, size_t oldSize);
|
||||
*/
|
||||
#endif
|
||||
|
||||
|
||||
#if defined(_MSC_VER) && (_MSC_VER < 1600)
|
||||
// If you want to use default operator new(), you can disable the following line
|
||||
#define Z7_REDEFINE_OPERATOR_NEW
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef Z7_REDEFINE_OPERATOR_NEW
|
||||
|
||||
// std::bad_alloc can require additional DLL dependency.
|
||||
// So we don't define CNewException as std::bad_alloc here.
|
||||
|
||||
class CNewException {};
|
||||
|
||||
void *
|
||||
#ifdef _MSC_VER
|
||||
__cdecl
|
||||
#endif
|
||||
operator new(size_t size);
|
||||
|
||||
/*
|
||||
#if 0 && defined(_MSC_VER) && _MSC_VER == 1600
|
||||
#define Z7_OPERATOR_DELETE_SPEC_THROW0
|
||||
#else
|
||||
#define Z7_OPERATOR_DELETE_SPEC_THROW0 throw()
|
||||
#endif
|
||||
*/
|
||||
#if defined(_MSC_VER) && _MSC_VER == 1600
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable : 4986) // 'operator delete': exception specification does not match previous declaration
|
||||
#endif
|
||||
|
||||
void
|
||||
#ifdef _MSC_VER
|
||||
__cdecl
|
||||
#endif
|
||||
operator delete(void *p) throw();
|
||||
|
||||
void
|
||||
#ifdef _MSC_VER
|
||||
__cdecl
|
||||
#endif
|
||||
operator delete(void *p, size_t n) throw();
|
||||
|
||||
#if defined(_MSC_VER) && _MSC_VER == 1600
|
||||
#pragma warning(pop)
|
||||
#endif
|
||||
|
||||
|
||||
#else
|
||||
|
||||
#include <new>
|
||||
|
||||
#define CNewException std::bad_alloc
|
||||
|
||||
#endif
|
||||
|
||||
/*
|
||||
#ifdef _WIN32
|
||||
void *
|
||||
#ifdef _MSC_VER
|
||||
__cdecl
|
||||
#endif
|
||||
operator new[](size_t size);
|
||||
|
||||
void
|
||||
#ifdef _MSC_VER
|
||||
__cdecl
|
||||
#endif
|
||||
operator delete[](void *p) throw();
|
||||
#endif
|
||||
*/
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user