Fixed sign extension bug in EH_prolog, and made trylevel an int to

avoid similar problems.
This commit is contained in:
Alexandre Julliard 2002-10-10 17:56:48 +00:00
parent f8da8541eb
commit d78b458ed1
1 changed files with 9 additions and 10 deletions

View File

@ -46,7 +46,7 @@ typedef void (*MSVCRT_sig_handler_func)(void);
/* VC++ extensions to Win32 SEH */ /* VC++ extensions to Win32 SEH */
typedef struct _SCOPETABLE typedef struct _SCOPETABLE
{ {
DWORD previousTryLevel; int previousTryLevel;
int (*lpfnFilter)(PEXCEPTION_POINTERS); int (*lpfnFilter)(PEXCEPTION_POINTERS);
int (*lpfnHandler)(void); int (*lpfnHandler)(void);
} SCOPETABLE, *PSCOPETABLE; } SCOPETABLE, *PSCOPETABLE;
@ -57,12 +57,12 @@ typedef struct _MSVCRT_EXCEPTION_FRAME
void (*handler)(PEXCEPTION_RECORD, PEXCEPTION_FRAME, void (*handler)(PEXCEPTION_RECORD, PEXCEPTION_FRAME,
PCONTEXT, PEXCEPTION_RECORD); PCONTEXT, PEXCEPTION_RECORD);
PSCOPETABLE scopetable; PSCOPETABLE scopetable;
DWORD trylevel; int trylevel;
int _ebp; int _ebp;
PEXCEPTION_POINTERS xpointers; PEXCEPTION_POINTERS xpointers;
} MSVCRT_EXCEPTION_FRAME; } MSVCRT_EXCEPTION_FRAME;
#define TRYLEVEL_END 0xffffffff /* End of trylevel list */ #define TRYLEVEL_END (-1) /* End of trylevel list */
#if defined(__GNUC__) && defined(__i386__) #if defined(__GNUC__) && defined(__i386__)
inline static void call_finally_block( void *code_block, void *base_ptr ) inline static void call_finally_block( void *code_block, void *base_ptr )
@ -107,7 +107,7 @@ int _XcptFilter(int ex, PEXCEPTION_POINTERS ptr)
#ifdef __i386__ #ifdef __i386__
/* Provided for VC++ binary compatability only */ /* Provided for VC++ binary compatability only */
__ASM_GLOBAL_FUNC(_EH_prolog, __ASM_GLOBAL_FUNC(_EH_prolog,
"pushl $0xff\n\t" "pushl $-1\n\t"
"pushl %eax\n\t" "pushl %eax\n\t"
"pushl %fs:0\n\t" "pushl %fs:0\n\t"
"movl %esp, %fs:0\n\t" "movl %esp, %fs:0\n\t"
@ -130,14 +130,12 @@ void _global_unwind2(PEXCEPTION_FRAME frame)
/******************************************************************* /*******************************************************************
* _local_unwind2 (MSVCRT.@) * _local_unwind2 (MSVCRT.@)
*/ */
void _local_unwind2(MSVCRT_EXCEPTION_FRAME* frame, void _local_unwind2(MSVCRT_EXCEPTION_FRAME* frame, int trylevel)
DWORD trylevel)
{ {
MSVCRT_EXCEPTION_FRAME *curframe = frame; MSVCRT_EXCEPTION_FRAME *curframe = frame;
DWORD curtrylevel = 0xfe;
EXCEPTION_FRAME reg; EXCEPTION_FRAME reg;
TRACE("(%p,%ld,%ld)\n",frame, frame->trylevel, trylevel); TRACE("(%p,%d,%d)\n",frame, frame->trylevel, trylevel);
/* Register a handler in case of a nested exception */ /* Register a handler in case of a nested exception */
reg.Handler = (PEXCEPTION_HANDLER)MSVCRT_nested_handler; reg.Handler = (PEXCEPTION_HANDLER)MSVCRT_nested_handler;
@ -146,7 +144,7 @@ void _local_unwind2(MSVCRT_EXCEPTION_FRAME* frame,
while (frame->trylevel != TRYLEVEL_END && frame->trylevel != trylevel) while (frame->trylevel != TRYLEVEL_END && frame->trylevel != trylevel)
{ {
curtrylevel = frame->scopetable[frame->trylevel].previousTryLevel; int curtrylevel = frame->scopetable[frame->trylevel].previousTryLevel;
curframe = frame; curframe = frame;
curframe->trylevel = curtrylevel; curframe->trylevel = curtrylevel;
if (!frame->scopetable[curtrylevel].lpfnFilter) if (!frame->scopetable[curtrylevel].lpfnFilter)
@ -183,7 +181,8 @@ int _except_handler3(PEXCEPTION_RECORD rec,
PCONTEXT context, void* dispatcher) PCONTEXT context, void* dispatcher)
{ {
#if defined(__GNUC__) && defined(__i386__) #if defined(__GNUC__) && defined(__i386__)
long retval, trylevel; long retval;
int trylevel;
EXCEPTION_POINTERS exceptPtrs; EXCEPTION_POINTERS exceptPtrs;
PSCOPETABLE pScopeTable; PSCOPETABLE pScopeTable;