msvcrt: Don't reimplement call_unwind_func().
Signed-off-by: Zebediah Figura <zfigura@codeweavers.com> Signed-off-by: Piotr Caban <piotr@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
77e92cf72c
commit
88f273b77c
|
@ -59,7 +59,7 @@ typedef struct __catchblock_info
|
||||||
UINT flags; /* flags (see below) */
|
UINT flags; /* flags (see below) */
|
||||||
const type_info *type_info; /* C++ type caught by this block */
|
const type_info *type_info; /* C++ type caught by this block */
|
||||||
int offset; /* stack offset to copy exception object to */
|
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;
|
} catchblock_info;
|
||||||
#define TYPE_FLAG_CONST 1
|
#define TYPE_FLAG_CONST 1
|
||||||
#define TYPE_FLAG_VOLATILE 2
|
#define TYPE_FLAG_VOLATILE 2
|
||||||
|
@ -79,7 +79,7 @@ typedef struct __tryblock_info
|
||||||
typedef struct __unwind_info
|
typedef struct __unwind_info
|
||||||
{
|
{
|
||||||
int prev; /* prev trylevel unwind handler, to run after this one */
|
int prev; /* prev trylevel unwind handler, to run after this one */
|
||||||
void (*handler)(void);/* unwind handler */
|
void * (*handler)(void);/* unwind handler */
|
||||||
} unwind_info;
|
} unwind_info;
|
||||||
|
|
||||||
/* descriptor of all try blocks of a given function */
|
/* 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,
|
const cxx_function_descr *descr,
|
||||||
EXCEPTION_REGISTRATION_RECORD* nested_frame, int nested_trylevel ) DECLSPEC_HIDDEN;
|
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 */
|
/* call a copy constructor */
|
||||||
extern void call_copy_ctor( void *func, void *this, void *src, int has_vbase );
|
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 */
|
/* 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)
|
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;
|
int trylevel = frame->trylevel;
|
||||||
|
|
||||||
while (trylevel != last_level)
|
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",
|
TRACE( "calling unwind handler %p trylevel %d last %d ebp %p\n",
|
||||||
handler, trylevel, last_level, &frame->ebp );
|
handler, trylevel, last_level, &frame->ebp );
|
||||||
call_ebp_func( handler, &frame->ebp );
|
call_handler( handler, &frame->ebp );
|
||||||
}
|
}
|
||||||
trylevel = descr->unwind_table[trylevel].prev;
|
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;
|
nested_frame.trylevel = nested_trylevel + 1;
|
||||||
|
|
||||||
__wine_push_frame( &nested_frame.frame );
|
__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 );
|
__wine_pop_frame( &nested_frame.frame );
|
||||||
|
|
||||||
((DWORD*)frame)[-1] = save_esp;
|
((DWORD*)frame)[-1] = save_esp;
|
||||||
|
|
Loading…
Reference in New Issue