Piotr Caban : msvcrt: Add i386 _IsExceptionObjectToBeDestroyed implementation.
Alexandre Julliard
julliard at wine.codeweavers.com
Wed Mar 16 11:36:40 CDT 2016
Module: wine
Branch: master
Commit: 0ef61844b8307c392b4fa0a25b8fcf3ecbff8326
URL: http://source.winehq.org/git/wine.git/?a=commit;h=0ef61844b8307c392b4fa0a25b8fcf3ecbff8326
Author: Piotr Caban <piotr at codeweavers.com>
Date: Tue Mar 15 13:40:46 2016 +0100
msvcrt: Add i386 _IsExceptionObjectToBeDestroyed implementation.
Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
.../api-ms-win-crt-private-l1-1-0.spec | 2 +-
dlls/msvcr100/msvcr100.spec | 2 +-
dlls/msvcr110/msvcr110.spec | 2 +-
dlls/msvcr120/msvcr120.spec | 2 +-
dlls/msvcr120_app/msvcr120_app.spec | 2 +-
dlls/msvcr80/msvcr80.spec | 2 +-
dlls/msvcr90/msvcr90.spec | 2 +-
dlls/msvcrt/except_arm.c | 9 ++++++++
dlls/msvcrt/except_i386.c | 27 ++++++++++++++++++++++
dlls/msvcrt/except_x86_64.c | 9 ++++++++
dlls/ucrtbase/ucrtbase.spec | 2 +-
dlls/vcruntime140/vcruntime140.spec | 2 +-
12 files changed, 54 insertions(+), 9 deletions(-)
diff --git a/dlls/api-ms-win-crt-private-l1-1-0/api-ms-win-crt-private-l1-1-0.spec b/dlls/api-ms-win-crt-private-l1-1-0/api-ms-win-crt-private-l1-1-0.spec
index b77b73e..8674f44 100644
--- a/dlls/api-ms-win-crt-private-l1-1-0/api-ms-win-crt-private-l1-1-0.spec
+++ b/dlls/api-ms-win-crt-private-l1-1-0/api-ms-win-crt-private-l1-1-0.spec
@@ -4,7 +4,7 @@
@ stub _FindAndUnlinkFrame
@ stub _GetImageBase
@ stub _GetThrowImageBase
-@ stub _IsExceptionObjectToBeDestroyed
+@ cdecl -arch=i386,x86_64,arm _IsExceptionObjectToBeDestroyed(ptr) ucrtbase._IsExceptionObjectToBeDestroyed
@ stub _NLG_Dispatch2
@ stub _NLG_Return
@ stub _NLG_Return2
diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec
index 39742aa..15a446f 100644
--- a/dlls/msvcr100/msvcr100.spec
+++ b/dlls/msvcr100/msvcr100.spec
@@ -530,7 +530,7 @@
@ cdecl _Getmonths()
@ cdecl _Gettnames()
@ extern _HUGE MSVCRT__HUGE
-@ stub _IsExceptionObjectToBeDestroyed
+@ cdecl -arch=i386,x86_64,arm _IsExceptionObjectToBeDestroyed(ptr)
@ stub _NLG_Dispatch2
@ stub _NLG_Return
@ stub _NLG_Return2
diff --git a/dlls/msvcr110/msvcr110.spec b/dlls/msvcr110/msvcr110.spec
index c1ee3a2..ccc659f 100644
--- a/dlls/msvcr110/msvcr110.spec
+++ b/dlls/msvcr110/msvcr110.spec
@@ -853,7 +853,7 @@
@ cdecl _Getmonths()
@ cdecl _Gettnames()
@ extern _HUGE MSVCRT__HUGE
-@ stub _IsExceptionObjectToBeDestroyed
+@ cdecl -arch=i386,x86_64,arm _IsExceptionObjectToBeDestroyed(ptr)
@ stub _Lock_shared_ptr_spin_lock
@ stub -arch=i386 _NLG_Dispatch2
@ stub -arch=arm,win64 __NLG_Dispatch2
diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec
index 00efc6c..5f17e06 100644
--- a/dlls/msvcr120/msvcr120.spec
+++ b/dlls/msvcr120/msvcr120.spec
@@ -837,7 +837,7 @@
@ cdecl _Getmonths()
@ cdecl _Gettnames()
@ extern _HUGE MSVCRT__HUGE
-@ stub _IsExceptionObjectToBeDestroyed
+@ cdecl -arch=i386,x86_64,arm _IsExceptionObjectToBeDestroyed(ptr)
@ stub _LCbuild
@ stub -arch=i386 _NLG_Dispatch2
@ stub -arch=arm,win64 __NLG_Dispatch2
diff --git a/dlls/msvcr120_app/msvcr120_app.spec b/dlls/msvcr120_app/msvcr120_app.spec
index 87bf9dc..e978d20 100644
--- a/dlls/msvcr120_app/msvcr120_app.spec
+++ b/dlls/msvcr120_app/msvcr120_app.spec
@@ -831,7 +831,7 @@
@ cdecl _Getmonths() msvcr120._Getmonths
@ cdecl _Gettnames() msvcr120._Gettnames
@ extern _HUGE msvcr120._HUGE
-@ stub _IsExceptionObjectToBeDestroyed
+@ cdecl -arch=i386,x86_64,arm _IsExceptionObjectToBeDestroyed(ptr) msvcr120._IsExceptionObjectToBeDestroyed
@ stub _LCbuild
@ stub -arch=i386 _NLG_Dispatch2
@ stub -arch=arm,win64 __NLG_Dispatch2
diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec
index 17af90b..4df2215 100644
--- a/dlls/msvcr80/msvcr80.spec
+++ b/dlls/msvcr80/msvcr80.spec
@@ -162,7 +162,7 @@
@ cdecl _Getmonths()
@ cdecl _Gettnames()
@ extern _HUGE MSVCRT__HUGE
-@ stub _IsExceptionObjectToBeDestroyed
+@ cdecl -arch=i386,x86_64,arm _IsExceptionObjectToBeDestroyed(ptr)
@ stub -arch=i386 _NLG_Dispatch2
@ stub -arch=arm,win64 __NLG_Dispatch2
@ stub -arch=i386 _NLG_Return
diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec
index fd08455..4bb2adb 100644
--- a/dlls/msvcr90/msvcr90.spec
+++ b/dlls/msvcr90/msvcr90.spec
@@ -157,7 +157,7 @@
@ cdecl _Getmonths()
@ cdecl _Gettnames()
@ extern _HUGE MSVCRT__HUGE
-@ stub _IsExceptionObjectToBeDestroyed
+@ cdecl -arch=i386,x86_64,arm _IsExceptionObjectToBeDestroyed(ptr)
@ stub _NLG_Dispatch2
@ stub _NLG_Return
@ stub _NLG_Return2
diff --git a/dlls/msvcrt/except_arm.c b/dlls/msvcrt/except_arm.c
index 62dadef..2779841 100644
--- a/dlls/msvcrt/except_arm.c
+++ b/dlls/msvcrt/except_arm.c
@@ -75,6 +75,15 @@ int CDECL __CxxExceptionFilter( PEXCEPTION_POINTERS ptrs,
}
/*********************************************************************
+ * _IsExceptionObjectToBeDestroyed (MSVCR80.@)
+ */
+BOOL __cdecl _IsExceptionObjectToBeDestroyed(const void *obj)
+{
+ FIXME("%p not implemented\n", obj);
+ return FALSE;
+}
+
+/*********************************************************************
* __CxxFrameHandler (MSVCRT.@)
*/
EXCEPTION_DISPOSITION CDECL __CxxFrameHandler(EXCEPTION_RECORD *rec, DWORD frame, CONTEXT *context,
diff --git a/dlls/msvcrt/except_i386.c b/dlls/msvcrt/except_i386.c
index 1625854..660fb6d 100644
--- a/dlls/msvcrt/except_i386.c
+++ b/dlls/msvcrt/except_i386.c
@@ -415,6 +415,33 @@ static DWORD catch_function_nested_handler( EXCEPTION_RECORD *rec, EXCEPTION_REG
nested_frame->trylevel );
}
+/*********************************************************************
+ * _IsExceptionObjectToBeDestroyed (MSVCR80.@)
+ */
+BOOL __cdecl _IsExceptionObjectToBeDestroyed(const void *obj)
+{
+ EXCEPTION_REGISTRATION_RECORD *reg = NtCurrentTeb()->Tib.ExceptionList;
+
+ TRACE( "%p\n", obj );
+
+ while (reg != (EXCEPTION_REGISTRATION_RECORD*)-1)
+ {
+ if (reg->Handler == catch_function_nested_handler)
+ {
+ EXCEPTION_RECORD *rec = ((struct catch_func_nested_frame*)reg)->rec;
+
+ if(!(rec->ExceptionFlags & (EH_UNWINDING | EH_EXIT_UNWIND))
+ && rec->ExceptionCode == CXX_EXCEPTION && rec->NumberParameters == 3
+ && rec->ExceptionInformation[1] == (LONG_PTR)obj)
+ return FALSE;
+ }
+
+ reg = reg->Prev;
+ }
+
+ return TRUE;
+}
+
/* find and call the appropriate catch block for an exception */
/* returns the address to continue execution to after the catch block was called */
static inline void call_catch_block( PEXCEPTION_RECORD rec, cxx_exception_frame *frame,
diff --git a/dlls/msvcrt/except_x86_64.c b/dlls/msvcrt/except_x86_64.c
index 27d0a15..8f0301d 100644
--- a/dlls/msvcrt/except_x86_64.c
+++ b/dlls/msvcrt/except_x86_64.c
@@ -72,6 +72,15 @@ int CDECL __CxxExceptionFilter( PEXCEPTION_POINTERS ptrs,
}
/*********************************************************************
+ * _IsExceptionObjectToBeDestroyed (MSVCR80.@)
+ */
+BOOL __cdecl _IsExceptionObjectToBeDestroyed(const void *obj)
+{
+ FIXME ( "%p not implemented\n", obj );
+ return FALSE;
+}
+
+/*********************************************************************
* __CxxFrameHandler (MSVCRT.@)
*/
EXCEPTION_DISPOSITION CDECL __CxxFrameHandler( EXCEPTION_RECORD *rec, ULONG64 frame,
diff --git a/dlls/ucrtbase/ucrtbase.spec b/dlls/ucrtbase/ucrtbase.spec
index 15f3781..16540a5 100644
--- a/dlls/ucrtbase/ucrtbase.spec
+++ b/dlls/ucrtbase/ucrtbase.spec
@@ -30,7 +30,7 @@
@ cdecl _Getdays()
@ cdecl _Getmonths()
@ cdecl _Gettnames()
-@ stub _IsExceptionObjectToBeDestroyed
+@ cdecl -arch=i386,x86_64,arm _IsExceptionObjectToBeDestroyed(ptr)
@ stub _LCbuild
@ stub _LCmulcc
@ stub _LCmulcr
diff --git a/dlls/vcruntime140/vcruntime140.spec b/dlls/vcruntime140/vcruntime140.spec
index feb94ac..c518b15 100644
--- a/dlls/vcruntime140/vcruntime140.spec
+++ b/dlls/vcruntime140/vcruntime140.spec
@@ -2,7 +2,7 @@
@ stdcall _CxxThrowException(long long) ucrtbase._CxxThrowException
@ cdecl -arch=i386 -norelay _EH_prolog() ucrtbase._EH_prolog
@ stub _FindAndUnlinkFrame
-@ stub _IsExceptionObjectToBeDestroyed
+@ cdecl -arch=i386,x86_64,arm _IsExceptionObjectToBeDestroyed(ptr) ucrtbase._IsExceptionObjectToBeDestroyed
@ stub _NLG_Dispatch2
@ stub _NLG_Return
@ stub _NLG_Return2
More information about the wine-cvs
mailing list