Jacek Caban : ntdll: Allow Unix libraries to use exception macros.
Alexandre Julliard
julliard at winehq.org
Thu Oct 7 16:21:20 CDT 2021
Module: wine
Branch: master
Commit: 2ec2e136bfc6cc2cfe895b1268cca3b342737001
URL: https://source.winehq.org/git/wine.git/?a=commit;h=2ec2e136bfc6cc2cfe895b1268cca3b342737001
Author: Jacek Caban <jacek at codeweavers.com>
Date: Wed Oct 6 16:20:06 2021 +0200
ntdll: Allow Unix libraries to use exception macros.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/ntdll/unix/signal_arm.c | 1 -
dlls/ntdll/unix/signal_arm64.c | 1 -
dlls/ntdll/unix/signal_i386.c | 1 -
dlls/ntdll/unix/signal_x86_64.c | 1 -
dlls/ntdll/unix/thread.c | 10 +++++++++
dlls/ntdll/unix/virtual.c | 30 --------------------------
include/wine/unixlib.h | 47 +++++++++++++++++++++++++++++++++++++++++
7 files changed, 57 insertions(+), 34 deletions(-)
diff --git a/dlls/ntdll/unix/signal_arm.c b/dlls/ntdll/unix/signal_arm.c
index f024879b81f..584c1f2f0bf 100644
--- a/dlls/ntdll/unix/signal_arm.c
+++ b/dlls/ntdll/unix/signal_arm.c
@@ -61,7 +61,6 @@
#include "windef.h"
#include "winnt.h"
#include "winternl.h"
-#include "wine/exception.h"
#include "wine/asm.h"
#include "unix_private.h"
#include "wine/debug.h"
diff --git a/dlls/ntdll/unix/signal_arm64.c b/dlls/ntdll/unix/signal_arm64.c
index 145277b5418..df0c7dad1da 100644
--- a/dlls/ntdll/unix/signal_arm64.c
+++ b/dlls/ntdll/unix/signal_arm64.c
@@ -64,7 +64,6 @@
#include "windef.h"
#include "winnt.h"
#include "winternl.h"
-#include "wine/exception.h"
#include "wine/asm.h"
#include "unix_private.h"
#include "wine/debug.h"
diff --git a/dlls/ntdll/unix/signal_i386.c b/dlls/ntdll/unix/signal_i386.c
index e123f2c2a79..a709c85b4da 100644
--- a/dlls/ntdll/unix/signal_i386.c
+++ b/dlls/ntdll/unix/signal_i386.c
@@ -60,7 +60,6 @@
#include "winternl.h"
#include "ddk/wdm.h"
#include "wine/asm.h"
-#include "wine/exception.h"
#include "unix_private.h"
#include "wine/debug.h"
diff --git a/dlls/ntdll/unix/signal_x86_64.c b/dlls/ntdll/unix/signal_x86_64.c
index 9b18180301a..ffe7ef7db07 100644
--- a/dlls/ntdll/unix/signal_x86_64.c
+++ b/dlls/ntdll/unix/signal_x86_64.c
@@ -75,7 +75,6 @@
#include "windef.h"
#include "winternl.h"
#include "ddk/wdm.h"
-#include "wine/exception.h"
#include "wine/list.h"
#include "wine/asm.h"
#include "unix_private.h"
diff --git a/dlls/ntdll/unix/thread.c b/dlls/ntdll/unix/thread.c
index 839a75b4cac..384ac1d4119 100644
--- a/dlls/ntdll/unix/thread.c
+++ b/dlls/ntdll/unix/thread.c
@@ -1737,6 +1737,16 @@ NTSTATUS get_thread_context( HANDLE handle, void *context, BOOL *self, USHORT ma
}
+/***********************************************************************
+ * ntdll_set_exception_jmp_buf
+ */
+void ntdll_set_exception_jmp_buf( __wine_jmp_buf *jmp )
+{
+ assert( !jmp || !ntdll_get_thread_data()->jmp_buf );
+ ntdll_get_thread_data()->jmp_buf = jmp;
+}
+
+
BOOL get_thread_times(int unix_pid, int unix_tid, LARGE_INTEGER *kernel_time, LARGE_INTEGER *user_time)
{
#ifdef linux
diff --git a/dlls/ntdll/unix/virtual.c b/dlls/ntdll/unix/virtual.c
index 63655f0c928..924aa78b306 100644
--- a/dlls/ntdll/unix/virtual.c
+++ b/dlls/ntdll/unix/virtual.c
@@ -59,7 +59,6 @@
#include "windef.h"
#include "winnt.h"
#include "winternl.h"
-#include "wine/exception.h"
#include "wine/list.h"
#include "wine/rbtree.h"
#include "unix_private.h"
@@ -104,35 +103,6 @@ struct file_view
unsigned int protect; /* protection for all pages at allocation time and SEC_* flags */
};
-#undef __TRY
-#undef __EXCEPT
-#undef __ENDTRY
-
-#define __TRY \
- do { __wine_jmp_buf __jmp; \
- int __first = 1; \
- assert( !ntdll_get_thread_data()->jmp_buf ); \
- for (;;) if (!__first) \
- { \
- do {
-
-#define __EXCEPT \
- } while(0); \
- ntdll_get_thread_data()->jmp_buf = NULL; \
- break; \
- } else { \
- if (__wine_setjmpex( &__jmp, NULL )) { \
- do {
-
-#define __ENDTRY \
- } while (0); \
- break; \
- } \
- ntdll_get_thread_data()->jmp_buf = &__jmp; \
- __first = 0; \
- } \
- } while (0);
-
/* per-page protection flags */
#define VPROT_READ 0x01
#define VPROT_WRITE 0x02
diff --git a/include/wine/unixlib.h b/include/wine/unixlib.h
index 4abc3172192..920e3d32dc5 100644
--- a/include/wine/unixlib.h
+++ b/include/wine/unixlib.h
@@ -26,6 +26,8 @@ typedef UINT64 unixlib_handle_t;
extern NTSTATUS WINAPI __wine_unix_call( unixlib_handle_t handle, unsigned int code, void *args );
+#ifdef WINE_UNIX_LIB
+
/* some useful helpers from ntdll */
extern const char *ntdll_get_build_dir(void);
extern const char *ntdll_get_data_dir(void);
@@ -33,4 +35,49 @@ extern DWORD ntdll_umbstowcs( const char *src, DWORD srclen, WCHAR *dst, DWORD d
extern int ntdll_wcstoumbs( const WCHAR *src, DWORD srclen, char *dst, DWORD dstlen, BOOL strict );
extern NTSTATUS ntdll_init_syscalls( ULONG id, SYSTEM_SERVICE_TABLE *table, void **dispatcher );
+/* exception handling */
+
+#ifdef __i386__
+typedef struct { int reg[16]; } __wine_jmp_buf;
+#elif defined(__x86_64__)
+typedef struct { DECLSPEC_ALIGN(16) struct { unsigned __int64 Part[2]; } reg[16]; } __wine_jmp_buf;
+#elif defined(__arm__)
+typedef struct { int reg[28]; } __wine_jmp_buf;
+#elif defined(__aarch64__)
+typedef struct { __int64 reg[24]; } __wine_jmp_buf;
+#else
+typedef struct { int reg; } __wine_jmp_buf;
+#endif
+
+extern int __cdecl __attribute__ ((__nothrow__,__returns_twice__)) __wine_setjmpex( __wine_jmp_buf *buf,
+ EXCEPTION_REGISTRATION_RECORD *frame );
+extern void DECLSPEC_NORETURN __cdecl __wine_longjmp( __wine_jmp_buf *buf, int retval );
+extern void ntdll_set_exception_jmp_buf( __wine_jmp_buf *jmp );
+
+#define __TRY \
+ do { __wine_jmp_buf __jmp; \
+ int __first = 1; \
+ for (;;) if (!__first) \
+ { \
+ do {
+
+#define __EXCEPT \
+ } while(0); \
+ ntdll_set_exception_jmp_buf( NULL ); \
+ break; \
+ } else { \
+ if (__wine_setjmpex( &__jmp, NULL )) { \
+ do {
+
+#define __ENDTRY \
+ } while (0); \
+ break; \
+ } \
+ ntdll_set_exception_jmp_buf( &__jmp ); \
+ __first = 0; \
+ } \
+ } while (0);
+
+#endif /* WINE_UNIX_LIB */
+
#endif /* __WINE_WINE_UNIXLIB_H */
More information about the wine-cvs
mailing list