Zebediah Figura : msvcrt: Don't reimplement call_unwind_func().

Alexandre Julliard julliard at winehq.org
Tue Jun 12 17:36:03 CDT 2018


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

Author: Zebediah Figura <zfigura at codeweavers.com>
Date:   Mon Jun 11 17:55:48 2018 -0500

msvcrt: Don't reimplement call_unwind_func().

Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/msvcrt/except_i386.c | 28 ++++++----------------------
 1 file changed, 6 insertions(+), 22 deletions(-)

diff --git a/dlls/msvcrt/except_i386.c b/dlls/msvcrt/except_i386.c
index 3f22f3e..5812d10 100644
--- a/dlls/msvcrt/except_i386.c
+++ b/dlls/msvcrt/except_i386.c
@@ -59,7 +59,7 @@ typedef struct __catchblock_info
     UINT             flags;         /* flags (see below) */
     const type_info *type_info;     /* C++ type caught by this block */
     int              offset;        /* stack offset to copy exception object to */
-    void           (*handler)(void);/* catch block handler code */
+    void *         (*handler)(void);/* catch block handler code */
 } catchblock_info;
 #define TYPE_FLAG_CONST      1
 #define TYPE_FLAG_VOLATILE   2
@@ -78,8 +78,8 @@ typedef struct __tryblock_info
 /* info about the unwind handler for a given trylevel */
 typedef struct __unwind_info
 {
-    int    prev;          /* prev trylevel unwind handler, to run after this one */
-    void (*handler)(void);/* unwind handler */
+    int      prev;          /* prev trylevel unwind handler, to run after this one */
+    void * (*handler)(void);/* unwind handler */
 } unwind_info;
 
 /* descriptor of all try blocks of a given function */
@@ -137,22 +137,6 @@ DWORD CDECL cxx_frame_handler( PEXCEPTION_RECORD rec, cxx_exception_frame* frame
                                const cxx_function_descr *descr,
                                EXCEPTION_REGISTRATION_RECORD* nested_frame, int nested_trylevel ) DECLSPEC_HIDDEN;
 
-/* call a function with a given ebp */
-static inline void *call_ebp_func( void *func, void *ebp )
-{
-    void *ret;
-    int dummy;
-    __asm__ __volatile__ ("pushl %%ebx\n\t"
-                          "pushl %%ebp\n\t"
-                          "movl %4,%%ebp\n\t"
-                          "call *%%eax\n\t"
-                          "popl %%ebp\n\t"
-                          "popl %%ebx"
-                          : "=a" (ret), "=S" (dummy), "=D" (dummy)
-                          : "0" (func), "1" (ebp) : "ecx", "edx", "memory" );
-    return ret;
-}
-
 /* call a copy constructor */
 extern void call_copy_ctor( void *func, void *this, void *src, int has_vbase );
 
@@ -326,7 +310,7 @@ static void copy_exception( void *object, cxx_exception_frame *frame,
 /* unwind the local function up to a given trylevel */
 static void cxx_local_unwind( cxx_exception_frame* frame, const cxx_function_descr *descr, int last_level)
 {
-    void (*handler)(void);
+    void * (*handler)(void);
     int trylevel = frame->trylevel;
 
     while (trylevel != last_level)
@@ -341,7 +325,7 @@ static void cxx_local_unwind( cxx_exception_frame* frame, const cxx_function_des
         {
             TRACE( "calling unwind handler %p trylevel %d last %d ebp %p\n",
                    handler, trylevel, last_level, &frame->ebp );
-            call_ebp_func( handler, &frame->ebp );
+            call_handler( handler, &frame->ebp );
         }
         trylevel = descr->unwind_table[trylevel].prev;
     }
@@ -478,7 +462,7 @@ static inline void call_catch_block( PEXCEPTION_RECORD rec, CONTEXT *context,
             nested_frame.trylevel  = nested_trylevel + 1;
 
             __wine_push_frame( &nested_frame.frame );
-            addr = call_ebp_func( catchblock->handler, &frame->ebp );
+            addr = call_handler( catchblock->handler, &frame->ebp );
             __wine_pop_frame( &nested_frame.frame );
 
             ((DWORD*)frame)[-1] = save_esp;




More information about the wine-cvs mailing list