[PATCH 0/1] MR10181: msvcp140: Add _Xregex_error implementation.
From: Piotr Caban <piotr@codeweavers.com> Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=59342 --- dlls/msvcp110/msvcp110.spec | 2 +- dlls/msvcp120/msvcp120.spec | 2 +- dlls/msvcp120_app/msvcp120_app.spec | 2 +- dlls/msvcp140/msvcp140.spec | 2 +- dlls/msvcp90/exception.c | 90 +++++++++++++++++++++++++++++ dlls/msvcp_win/msvcp_win.spec | 2 +- 6 files changed, 95 insertions(+), 5 deletions(-) diff --git a/dlls/msvcp110/msvcp110.spec b/dlls/msvcp110/msvcp110.spec index daeb894b62d..2bc7e0bbeec 100644 --- a/dlls/msvcp110/msvcp110.spec +++ b/dlls/msvcp110/msvcp110.spec @@ -1842,7 +1842,7 @@ @ cdecl -arch=win64 ?_Xout_of_range@std@@YAXPEBD@Z(str) _Xout_of_range @ stub -arch=win32 ?_Xoverflow_error@std@@YAXPBD@Z @ stub -arch=win64 ?_Xoverflow_error@std@@YAXPEBD@Z -@ stub ?_Xregex_error@std@@YAXW4error_type@regex_constants@1@@Z +@ cdecl ?_Xregex_error@std@@YAXW4error_type@regex_constants@1@@Z(long) _Xregex_error @ cdecl -arch=win32 ?_Xruntime_error@std@@YAXPBD@Z(str) _Xruntime_error @ cdecl -arch=win64 ?_Xruntime_error@std@@YAXPEBD@Z(str) _Xruntime_error # extern ?adopt_lock@std@@3Uadopt_lock_t@1@B diff --git a/dlls/msvcp120/msvcp120.spec b/dlls/msvcp120/msvcp120.spec index 6a11e9cce8d..0a9f3ca47ee 100644 --- a/dlls/msvcp120/msvcp120.spec +++ b/dlls/msvcp120/msvcp120.spec @@ -1803,7 +1803,7 @@ @ cdecl -arch=win64 ?_Xout_of_range@std@@YAXPEBD@Z(str) _Xout_of_range @ stub -arch=win32 ?_Xoverflow_error@std@@YAXPBD@Z @ stub -arch=win64 ?_Xoverflow_error@std@@YAXPEBD@Z -@ stub ?_Xregex_error@std@@YAXW4error_type@regex_constants@1@@Z +@ cdecl ?_Xregex_error@std@@YAXW4error_type@regex_constants@1@@Z(long) _Xregex_error @ cdecl -arch=win32 ?_Xruntime_error@std@@YAXPBD@Z(str) _Xruntime_error @ cdecl -arch=win64 ?_Xruntime_error@std@@YAXPEBD@Z(str) _Xruntime_error # extern ?adopt_lock@std@@3Uadopt_lock_t@1@B diff --git a/dlls/msvcp120_app/msvcp120_app.spec b/dlls/msvcp120_app/msvcp120_app.spec index 427e20d6335..75651fabd1b 100644 --- a/dlls/msvcp120_app/msvcp120_app.spec +++ b/dlls/msvcp120_app/msvcp120_app.spec @@ -1803,7 +1803,7 @@ @ cdecl -arch=win64 ?_Xout_of_range@std@@YAXPEBD@Z(str) msvcp120.?_Xout_of_range@std@@YAXPEBD@Z @ stub -arch=win32 ?_Xoverflow_error@std@@YAXPBD@Z @ stub -arch=win64 ?_Xoverflow_error@std@@YAXPEBD@Z -@ stub ?_Xregex_error@std@@YAXW4error_type@regex_constants@1@@Z +@ cdecl ?_Xregex_error@std@@YAXW4error_type@regex_constants@1@@Z(long) msvcp120.?_Xregex_error@std@@YAXW4error_type@regex_constants@1@@Z @ cdecl -arch=win32 ?_Xruntime_error@std@@YAXPBD@Z(str) msvcp120.?_Xruntime_error@std@@YAXPBD@Z @ cdecl -arch=win64 ?_Xruntime_error@std@@YAXPEBD@Z(str) msvcp120.?_Xruntime_error@std@@YAXPEBD@Z # extern ?adopt_lock@std@@3Uadopt_lock_t@1@B diff --git a/dlls/msvcp140/msvcp140.spec b/dlls/msvcp140/msvcp140.spec index 8e769af1242..4faf71ae3f7 100644 --- a/dlls/msvcp140/msvcp140.spec +++ b/dlls/msvcp140/msvcp140.spec @@ -1687,7 +1687,7 @@ @ cdecl -arch=win64 ?_Xout_of_range@std@@YAXPEBD@Z(str) _Xout_of_range @ stub -arch=win32 ?_Xoverflow_error@std@@YAXPBD@Z @ stub -arch=win64 ?_Xoverflow_error@std@@YAXPEBD@Z -@ stub ?_Xregex_error@std@@YAXW4error_type@regex_constants@1@@Z +@ cdecl ?_Xregex_error@std@@YAXW4error_type@regex_constants@1@@Z(long) _Xregex_error @ cdecl -arch=win32 ?_Xruntime_error@std@@YAXPBD@Z(str) _Xruntime_error @ cdecl -arch=win64 ?_Xruntime_error@std@@YAXPEBD@Z(str) _Xruntime_error @ cdecl -arch=win32 ?__ExceptionPtrAssign@@YAXPAXPBX@Z(ptr ptr) __ExceptionPtrAssign diff --git a/dlls/msvcp90/exception.c b/dlls/msvcp90/exception.c index 177bd5143dd..22d17497639 100644 --- a/dlls/msvcp90/exception.c +++ b/dlls/msvcp90/exception.c @@ -78,6 +78,7 @@ extern const vtable_ptr bad_cast_vtable; extern const vtable_ptr range_error_vtable; /* ??_7bad_function_call@std@@6B@ */ extern const vtable_ptr bad_function_call_vtable; +extern const vtable_ptr regex_error_vtable; /* ??0exception@@QAE@ABQBD@Z */ /* ??0exception@@QEAA@AEBQEBD@Z */ @@ -903,6 +904,90 @@ DEFINE_RTTI_DATA(bad_function_call, 0, ".?AVbad_function_call@std@@", exception_ DEFINE_CXX_TYPE(bad_function_call, MSVCP_exception_dtor, exception_cxx_type_info) #endif +#if _MSVCP_VER >= 110 +/* regex_error class data */ +enum regex_constants { + error_collate, + error_ctype, + error_escape, + error_backref, + error_brack, + error_paren, + error_brace, + error_badbrace, + error_range, + error_space, + error_badrepeat, + error_complexity, + error_stack, + error_parse, + error_syntax +}; + +typedef struct { + runtime_error base; + enum regex_constants err; +} regex_error; + +static regex_error* regex_error_ctor(regex_error *this, enum regex_constants err) +{ + const char *str; + + TRACE("%p %d\n", this, err); + + switch(err) + { + case error_collate: str = "regex_error(error_collate)"; break; + case error_ctype: str = "regex_error(error_ctype)"; break; + case error_escape: str = "regex_error(error_escape)"; break; + case error_backref: str = "regex_error(error_backref)"; break; + case error_brack: str = "regex_error(error_brack)"; break; + case error_paren: str = "regex_error(error_paren)"; break; + case error_brace: str = "regex_error(error_brace)"; break; + case error_badbrace: str = "regex_error(error_badbrace)"; break; + case error_range: str = "regex_error(error_range)"; break; + case error_space: str = "regex_error(error_space)"; break; + case error_badrepeat: str = "regex_error(error_badrepeat)"; break; + case error_complexity: str = "regex_error(error_complexity)"; break; + case error_stack: str = "regex_error(error_stack)"; break; + case error_parse: str = "regex_error(error_parse)"; break; + case error_syntax: str = "regex_error(error_syntax)"; break; + default: str = "regex_error"; break; + } + + MSVCP_runtime_error_ctor(&this->base, &str); + this->err = err; + this->base.e.vtable = ®ex_error_vtable; + return this; +} + +DEFINE_THISCALL_WRAPPER(regex_error_copy_ctor, 8) +regex_error* __thiscall regex_error_copy_ctor( + regex_error *this, regex_error *rhs) +{ + TRACE("%p %p\n", this, rhs); + runtime_error_copy_ctor(&this->base, &rhs->base); + this->err = rhs->err; + this->base.e.vtable = ®ex_error_vtable; + return this; +} + +DEFINE_RTTI_DATA(regex_error, 0, ".?AVregex_error@std@@", + runtime_error_rtti_base_descriptor, exception_rtti_base_descriptor) +DEFINE_CXX_TYPE(regex_error, MSVCP_runtime_error_dtor, + runtime_error_cxx_type_info, exception_cxx_type_info) + +void __cdecl DECLSPEC_NORETURN _Xregex_error(enum regex_constants err) +{ + regex_error e; + + TRACE("(%d)\n", err); + + regex_error_ctor(&e, err); + _CxxThrowException(&e, ®ex_error_exception_type); +} +#endif + /* ?_Nomemory@std@@YAXXZ */ void __cdecl DECLSPEC_NORETURN _Nomemory(void) { @@ -1453,6 +1538,9 @@ __ASM_BLOCK_BEGIN(exception_vtables) EXCEPTION_VTABLE(future_error, VTABLE_ADD_FUNC(MSVCP_logic_error_vector_dtor) VTABLE_ADD_FUNC(MSVCP_future_error_what)); + EXCEPTION_VTABLE(regex_error, + VTABLE_ADD_FUNC(MSVCP_runtime_error_vector_dtor) + VTABLE_ADD_FUNC(MSVCP_runtime_error_what)); #endif #if _MSVCP_VER > 110 EXCEPTION_VTABLE(_System_error, @@ -1521,6 +1609,7 @@ void init_exception(void *base) INIT_RTTI(runtime_error, base); #if _MSVCP_VER >= 110 INIT_RTTI(future_error, base); + INIT_RTTI(regex_error, base); #endif #if _MSVCP_VER > 110 INIT_RTTI(_System_error, base); @@ -1542,6 +1631,7 @@ void init_exception(void *base) INIT_CXX_TYPE(runtime_error, base); #if _MSVCP_VER >= 110 INIT_CXX_TYPE(future_error, base); + INIT_CXX_TYPE(regex_error, base); #endif #if _MSVCP_VER > 110 INIT_CXX_TYPE(_System_error, base); diff --git a/dlls/msvcp_win/msvcp_win.spec b/dlls/msvcp_win/msvcp_win.spec index c0f4888507d..69eb0a38040 100644 --- a/dlls/msvcp_win/msvcp_win.spec +++ b/dlls/msvcp_win/msvcp_win.spec @@ -1686,7 +1686,7 @@ @ cdecl -arch=win64 ?_Xout_of_range@std@@YAXPEBD@Z(str) msvcp140.?_Xout_of_range@std@@YAXPEBD@Z @ stub -arch=win32 ?_Xoverflow_error@std@@YAXPBD@Z @ stub -arch=win64 ?_Xoverflow_error@std@@YAXPEBD@Z -@ stub ?_Xregex_error@std@@YAXW4error_type@regex_constants@1@@Z +@ cdecl ?_Xregex_error@std@@YAXW4error_type@regex_constants@1@@Z(long) msvcp140.?_Xregex_error@std@@YAXW4error_type@regex_constants@1@@Z @ cdecl -arch=win32 ?_Xruntime_error@std@@YAXPBD@Z(str) msvcp140.?_Xruntime_error@std@@YAXPBD@Z @ cdecl -arch=win64 ?_Xruntime_error@std@@YAXPEBD@Z(str) msvcp140.?_Xruntime_error@std@@YAXPEBD@Z @ cdecl -arch=win32 ?__ExceptionPtrAssign@@YAXPAXPBX@Z(ptr ptr) msvcp140.?__ExceptionPtrAssign@@YAXPAXPBX@Z -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10181
participants (2)
-
Piotr Caban -
Piotr Caban (@piotr)