Alexandre Julliard : winecrt0: Store the appropriate longjmp() function in the exception frame.
Alexandre Julliard
julliard at winehq.org
Tue May 14 15:43:01 CDT 2019
Module: wine
Branch: master
Commit: 9177a75acc36b6d593917262fb62f42098a1fcf2
URL: https://source.winehq.org/git/wine.git/?a=commit;h=9177a75acc36b6d593917262fb62f42098a1fcf2
Author: Alexandre Julliard <julliard at winehq.org>
Date: Tue May 14 13:14:35 2019 +0200
winecrt0: Store the appropriate longjmp() function in the exception frame.
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/winecrt0/exception.c | 2 +-
include/wine/exception.h | 9 +++++++--
2 files changed, 8 insertions(+), 3 deletions(-)
diff --git a/dlls/winecrt0/exception.c b/dlls/winecrt0/exception.c
index 8a7f2a5..98132fa 100644
--- a/dlls/winecrt0/exception.c
+++ b/dlls/winecrt0/exception.c
@@ -59,7 +59,7 @@ static void DECLSPEC_NORETURN unwind_target(void)
{
__WINE_FRAME *wine_frame = (__WINE_FRAME *)__wine_get_frame();
__wine_pop_frame( &wine_frame->frame );
- siglongjmp( wine_frame->jmp, 1 );
+ for (;;) wine_frame->longjmp( wine_frame->jmp, 1 );
}
static void DECLSPEC_NORETURN unwind_frame( EXCEPTION_RECORD *record,
diff --git a/include/wine/exception.h b/include/wine/exception.h
index e93968f..f30807e 100644
--- a/include/wine/exception.h
+++ b/include/wine/exception.h
@@ -94,8 +94,8 @@ extern "C" {
#if defined(__MINGW32__) || defined(__CYGWIN__) || defined(__WINE_SETJMP_H)
#define sigjmp_buf jmp_buf
-#define sigsetjmp(buf,sigs) setjmp(buf)
-#define siglongjmp(buf,val) longjmp(buf,val)
+static inline int sigsetjmp( sigjmp_buf buf, int sigs ) { return setjmp( buf ); }
+static inline void siglongjmp( sigjmp_buf buf, int val ) { longjmp( buf, val ); }
#endif
extern void __wine_rtl_unwind( EXCEPTION_REGISTRATION_RECORD* frame, EXCEPTION_RECORD *record,
@@ -139,6 +139,7 @@ extern DWORD __wine_finally_ctx_handler( EXCEPTION_RECORD *record,
} else { \
__f.frame.Handler = __wine_exception_handler; \
__f.u.filter = (func); \
+ __f.longjmp = siglongjmp; \
if (sigsetjmp( __f.jmp, 0 )) { \
const __WINE_FRAME * const __eptr __attribute__((unused)) = &__f; \
do {
@@ -151,6 +152,7 @@ extern DWORD __wine_finally_ctx_handler( EXCEPTION_RECORD *record,
__f.frame.Handler = __wine_exception_ctx_handler; \
__f.u.filter_ctx = (func); \
__f.ctx = context; \
+ __f.longjmp = siglongjmp; \
if (sigsetjmp( __f.jmp, 0 )) { \
const __WINE_FRAME * const __eptr __attribute__((unused)) = &__f; \
do {
@@ -162,6 +164,7 @@ extern DWORD __wine_finally_ctx_handler( EXCEPTION_RECORD *record,
break; \
} else { \
__f.frame.Handler = __wine_exception_handler_page_fault; \
+ __f.longjmp = siglongjmp; \
if (sigsetjmp( __f.jmp, 0 )) { \
const __WINE_FRAME * const __eptr __attribute__((unused)) = &__f; \
do {
@@ -173,6 +176,7 @@ extern DWORD __wine_finally_ctx_handler( EXCEPTION_RECORD *record,
break; \
} else { \
__f.frame.Handler = __wine_exception_handler_all; \
+ __f.longjmp = siglongjmp; \
if (sigsetjmp( __f.jmp, 0 )) { \
const __WINE_FRAME * const __eptr __attribute__((unused)) = &__f; \
do {
@@ -237,6 +241,7 @@ typedef struct __tagWINE_FRAME
} u;
void *ctx;
sigjmp_buf jmp;
+ void (*longjmp)(sigjmp_buf,int);
/* hack to make GetExceptionCode() work in handler */
DWORD ExceptionCode;
const struct __tagWINE_FRAME *ExceptionRecord;
More information about the wine-cvs
mailing list