Piotr Caban : ucrtbase: Add __processing_throw implementation.

Alexandre Julliard julliard at winehq.org
Tue Mar 20 17:51:36 CDT 2018


Module: wine
Branch: master
Commit: 9999c59c486b2e6d724a95a63fcfbfc1ce46df9a
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=9999c59c486b2e6d724a95a63fcfbfc1ce46df9a

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Tue Mar 20 15:36:48 2018 +0100

ucrtbase: Add __processing_throw 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/msvcrt/except.c                                             | 9 +++++++++
 dlls/msvcrt/except_i386.c                                        | 6 ++++--
 dlls/msvcrt/except_x86_64.c                                      | 4 ++++
 dlls/msvcrt/msvcrt.h                                             | 1 +
 dlls/ucrtbase/ucrtbase.spec                                      | 2 +-
 dlls/vcruntime140/vcruntime140.spec                              | 2 +-
 7 files changed, 21 insertions(+), 5 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 af23f8d..9ddb5dd 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
@@ -40,7 +40,7 @@
 @ stub __intrinsic_abnormal_termination
 @ cdecl -arch=i386,x86_64,arm,arm64 -norelay __intrinsic_setjmp(ptr) ucrtbase.__intrinsic_setjmp
 @ cdecl -arch=x86_64,arm64 -norelay __intrinsic_setjmpex(ptr ptr) ucrtbase.__intrinsic_setjmpex
-@ stub __processing_throw
+@ cdecl __processing_throw() ucrtbase.__processing_throw
 @ stub __report_gsfailure
 @ cdecl __std_exception_copy(ptr ptr) ucrtbase.__std_exception_copy
 @ cdecl __std_exception_destroy(ptr) ucrtbase.__std_exception_destroy
diff --git a/dlls/msvcrt/except.c b/dlls/msvcrt/except.c
index 286c82f..b99c98b 100644
--- a/dlls/msvcrt/except.c
+++ b/dlls/msvcrt/except.c
@@ -528,4 +528,13 @@ void** CDECL __current_exception_context(void)
     return (void**)&msvcrt_get_thread_data()->ctx_record;
 }
 
+/*********************************************************************
+ *  __processing_throw (UCRTBASE.@)
+ */
+int* CDECL __processing_throw(void)
+{
+    TRACE("()\n");
+    return &msvcrt_get_thread_data()->processing_throw;
+}
+
 #endif /* _MSVCR_VER>=140 */
diff --git a/dlls/msvcrt/except_i386.c b/dlls/msvcrt/except_i386.c
index 09dec65..5121301 100644
--- a/dlls/msvcrt/except_i386.c
+++ b/dlls/msvcrt/except_i386.c
@@ -412,8 +412,9 @@ static inline void call_catch_block( PEXCEPTION_RECORD rec, CONTEXT *context,
     struct catch_func_nested_frame nested_frame;
     int trylevel = frame->trylevel;
     DWORD save_esp = ((DWORD*)frame)[-1];
-    thread_data_t *data;
+    thread_data_t *data = msvcrt_get_thread_data();
 
+    data->processing_throw++;
     for (i = 0; i < descr->tryblock_count; i++)
     {
         const tryblock_info *tryblock = &descr->tryblock[i];
@@ -456,11 +457,11 @@ static inline void call_catch_block( PEXCEPTION_RECORD rec, CONTEXT *context,
             cxx_local_unwind( frame, descr, tryblock->start_level );
             frame->trylevel = tryblock->end_level + 1;
 
-            data = msvcrt_get_thread_data();
             nested_frame.frame_info.rec = data->exc_record;
             nested_frame.frame_info.context = data->ctx_record;
             data->exc_record = rec;
             data->ctx_record = context;
+            data->processing_throw--;
 
             /* call the catch block */
             TRACE( "calling catch block %p addr %p ebp %p\n",
@@ -483,6 +484,7 @@ static inline void call_catch_block( PEXCEPTION_RECORD rec, CONTEXT *context,
             continue_after_catch( frame, addr );
         }
     }
+    data->processing_throw--;
 }
 
 /*********************************************************************
diff --git a/dlls/msvcrt/except_x86_64.c b/dlls/msvcrt/except_x86_64.c
index 7859a63..77c519d 100644
--- a/dlls/msvcrt/except_x86_64.c
+++ b/dlls/msvcrt/except_x86_64.c
@@ -363,6 +363,7 @@ static void* WINAPI call_catch_block(EXCEPTION_RECORD *rec)
 
     ctx.rethrow = FALSE;
     __CxxRegisterExceptionObject(&ep, &ctx.frame_info);
+    msvcrt_get_thread_data()->processing_throw--;
     __TRY
     {
         __TRY
@@ -410,12 +411,14 @@ static inline void find_catch_block(EXCEPTION_RECORD *rec, CONTEXT *context,
     ULONG64 exc_base = (rec->NumberParameters == 4 ? rec->ExceptionInformation[3] : 0);
     int trylevel = ip_to_state(rva_to_ptr(descr->ipmap, dispatch->ImageBase),
             descr->ipmap_count, dispatch->ControlPc-dispatch->ImageBase);
+    thread_data_t *data = msvcrt_get_thread_data();
     const tryblock_info *in_catch;
     EXCEPTION_RECORD catch_record;
     CONTEXT ctx;
     UINT i, j;
     INT *unwind_help;
 
+    data->processing_throw++;
     for (i=descr->tryblock_count; i>0; i--)
     {
         in_catch = rva_to_ptr(descr->tryblock, dispatch->ImageBase);
@@ -494,6 +497,7 @@ static inline void find_catch_block(EXCEPTION_RECORD *rec, CONTEXT *context,
     }
 
     TRACE("no matching catch block found\n");
+    data->processing_throw--;
 }
 
 static LONG CALLBACK se_translation_filter(EXCEPTION_POINTERS *ep, void *c)
diff --git a/dlls/msvcrt/msvcrt.h b/dlls/msvcrt/msvcrt.h
index 7c48917..6b0f425 100644
--- a/dlls/msvcrt/msvcrt.h
+++ b/dlls/msvcrt/msvcrt.h
@@ -260,6 +260,7 @@ struct __thread_data {
     int                             unk7;
     EXCEPTION_RECORD               *exc_record;
     CONTEXT                        *ctx_record;
+    int                             processing_throw;
     frame_info                     *frame_info_head;
     void                           *unk8[6];
     LCID                            cached_lcid;
diff --git a/dlls/ucrtbase/ucrtbase.spec b/dlls/ucrtbase/ucrtbase.spec
index 2d4f798..ff33d86 100644
--- a/dlls/ucrtbase/ucrtbase.spec
+++ b/dlls/ucrtbase/ucrtbase.spec
@@ -135,7 +135,7 @@
 @ cdecl __p__wenviron() MSVCRT___p__wenviron
 @ cdecl __p__wpgmptr() MSVCRT___p__wpgmptr
 @ cdecl __pctype_func() MSVCRT___pctype_func
-@ stub __processing_throw
+@ cdecl __processing_throw()
 @ stub __pwctype_func
 @ cdecl __pxcptinfoptrs() MSVCRT___pxcptinfoptrs
 @ stub __report_gsfailure
diff --git a/dlls/vcruntime140/vcruntime140.spec b/dlls/vcruntime140/vcruntime140.spec
index 252113c..d304de6 100644
--- a/dlls/vcruntime140/vcruntime140.spec
+++ b/dlls/vcruntime140/vcruntime140.spec
@@ -34,7 +34,7 @@
 @ cdecl __current_exception_context() ucrtbase.__current_exception_context
 @ cdecl -arch=i386,x86_64,arm,arm64 -norelay __intrinsic_setjmp(ptr) ucrtbase.__intrinsic_setjmp
 @ cdecl -arch=x86_64,arm64 -norelay __intrinsic_setjmpex(ptr ptr) ucrtbase.__intrinsic_setjmpex
-@ stub __processing_throw
+@ cdecl __processing_throw() ucrtbase.__processing_throw
 @ stub __report_gsfailure
 @ cdecl __std_exception_copy(ptr ptr) ucrtbase.__std_exception_copy
 @ cdecl __std_exception_destroy(ptr) ucrtbase.__std_exception_destroy




More information about the wine-cvs mailing list