From: Rémi Bernon <rbernon@codeweavers.com> --- include/Makefile.in | 1 + include/msvcrt/vcruntime_exception.h | 92 ++++++++++++++++++++++++++++ 2 files changed, 93 insertions(+) create mode 100644 include/msvcrt/vcruntime_exception.h diff --git a/include/Makefile.in b/include/Makefile.in index dabb9c75944..0026ac978aa 100644 --- a/include/Makefile.in +++ b/include/Makefile.in @@ -578,6 +578,7 @@ SOURCES = \ msvcrt/uchar.h \ msvcrt/unistd.h \ msvcrt/vadefs.h \ + msvcrt/vcruntime_exception.h \ msvcrt/wchar.h \ msvcrt/wctype.h \ mswsock.h \ diff --git a/include/msvcrt/vcruntime_exception.h b/include/msvcrt/vcruntime_exception.h new file mode 100644 index 00000000000..f015945b060 --- /dev/null +++ b/include/msvcrt/vcruntime_exception.h @@ -0,0 +1,92 @@ +/* + * Copyright 2024 Rémi Bernon for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#ifndef __WINE_VCRUNTIME_EXCEPTION_H +#define __WINE_VCRUNTIME_EXCEPTION_H + +struct __std_exception_data +{ + const char *_What; + char _DoFree; +}; + +extern "C" +{ +void __cdecl __std_exception_copy(const struct __std_exception_data *src, struct __std_exception_data *dst); +void __cdecl __std_exception_destroy(struct __std_exception_data *data); +} /* extern "C" */ + +namespace std +{ + +class exception +{ +private: + struct __std_exception_data data; +public: + exception() noexcept : data() {} + exception(const exception &other) noexcept + { + __std_exception_copy(&other.data, &this->data); + } + explicit exception(const char *what) throw() : data() + { + struct __std_exception_data new_data = {what, true}; + __std_exception_copy(&new_data, &this->data); + } + explicit exception(const char *what, int) noexcept : data() + { + data._What = what; + } + exception &operator=(const exception &other) noexcept + { + if (this != &other) + { + __std_exception_destroy(&this->data); + __std_exception_copy(&other.data, &this->data); + } + return *this; + } + virtual ~exception() noexcept + { + __std_exception_destroy(&data); + } + virtual const char *what() const + { + return data._What ? data._What : "Unknown exception"; + } +}; + +class bad_alloc : public exception +{ +private: + friend class bad_array_new_length; + bad_alloc(const char *what) throw() : exception(what, 1) {} +public: + bad_alloc() throw() : exception("bad allocation", 1) {} +}; + +class bad_array_new_length : public bad_alloc +{ +public: + bad_array_new_length() noexcept : bad_alloc("bad array new length") {} +}; + +} /* namespace std */ + +#endif /* __WINE_VCRUNTIME_EXCEPTION_H */ -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10161