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