From: Jacek Caban <jacek@codeweavers.com> Based on libcxxabi. --- dlls/vcruntime140/Makefile.in | 3 +- dlls/vcruntime140/new.cpp | 170 ++++++++++++++++++++++++++++++++++ 2 files changed, 172 insertions(+), 1 deletion(-) create mode 100644 dlls/vcruntime140/new.cpp diff --git a/dlls/vcruntime140/Makefile.in b/dlls/vcruntime140/Makefile.in index 1f99225ffe8..715242c80ad 100644 --- a/dlls/vcruntime140/Makefile.in +++ b/dlls/vcruntime140/Makefile.in @@ -2,4 +2,5 @@ MODULE = vcruntime140.dll IMPORTLIB = vcruntime140 SOURCES = \ - misc.c + misc.c \ + new.cpp diff --git a/dlls/vcruntime140/new.cpp b/dlls/vcruntime140/new.cpp new file mode 100644 index 00000000000..ef3ce48f415 --- /dev/null +++ b/dlls/vcruntime140/new.cpp @@ -0,0 +1,170 @@ +//===--------------------- stdlib_new_delete.cpp --------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +// +// This file implements the new and delete operators. +//===----------------------------------------------------------------------===// + +#include <new.h> +#include <vcruntime_exception.h> +#include <malloc.h> + +#if 0 +#pragma makedep implib +#endif + +void *operator new(size_t size) +{ + if (size == 0) + size = 1; + void* p; + while ((p = ::malloc(size)) == 0) + { + if (!_callnewh(size)) + throw std::bad_alloc(); + } + return p; +} + +void *operator new(size_t size, const std::nothrow_t&) noexcept +{ + void* p = 0; + try + { + p = ::operator new(size); + } + catch (...) + { + } + return p; +} + +void *operator new[](size_t size) +{ + return ::operator new(size); +} + +void *operator new[](size_t size, const std::nothrow_t&) noexcept +{ + void* p = 0; + try + { + p = ::operator new[](size); + } + catch (...) + { + } + return p; +} + +void operator delete(void* ptr) noexcept +{ + if (ptr) + ::free(ptr); +} + +void operator delete(void* ptr, const std::nothrow_t&) noexcept +{ + ::operator delete(ptr); +} + +void operator delete(void* ptr, size_t) noexcept +{ + ::operator delete(ptr); +} + +void operator delete[] (void* ptr) noexcept +{ + ::operator delete(ptr); +} + +void operator delete[] (void* ptr, const std::nothrow_t&) noexcept +{ + ::operator delete[](ptr); +} + +void operator delete[] (void* ptr, size_t) noexcept +{ + ::operator delete[](ptr); +} + +void *operator new(size_t size, std::align_val_t alignment) +{ + if (size == 0) + size = 1; + if (static_cast<size_t>(alignment) < sizeof(void*)) + alignment = std::align_val_t(sizeof(void*)); + void* p; + while ((p = _aligned_malloc(size, static_cast<size_t>(alignment))) == nullptr) + { + if (!_callnewh(size)) + throw std::bad_alloc(); + } + return p; +} + +void *operator new(size_t size, std::align_val_t alignment, const std::nothrow_t&) noexcept +{ + void* p = 0; + try + { + p = ::operator new(size, alignment); + } + catch (...) + { + } + return p; +} + +void *operator new[](size_t size, std::align_val_t alignment) +{ + return ::operator new(size, alignment); +} + +void *operator new[](size_t size, std::align_val_t alignment, const std::nothrow_t&) noexcept +{ + void* p = 0; + try + { + p = ::operator new[](size, alignment); + } + catch (...) + { + } + return p; +} + +void operator delete(void* ptr, std::align_val_t) noexcept +{ + if (ptr) + ::_aligned_free(ptr); +} + +void operator delete(void* ptr, std::align_val_t alignment, const std::nothrow_t&) noexcept +{ + ::operator delete(ptr, alignment); +} + +void operator delete(void* ptr, size_t, std::align_val_t alignment) noexcept +{ + ::operator delete(ptr, alignment); +} + +void operator delete[] (void* ptr, std::align_val_t alignment) noexcept +{ + ::operator delete(ptr, alignment); +} + +void operator delete[] (void* ptr, std::align_val_t alignment, const std::nothrow_t&) noexcept +{ + ::operator delete[](ptr, alignment); +} + +void operator delete[] (void* ptr, size_t, std::align_val_t alignment) noexcept +{ + ::operator delete[](ptr, alignment); +} -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10273