[CRT]
[reactos.git] / reactos / include / reactos / wine / exception.h
index ec156ad..17ba84c 100644 (file)
@@ -1,6 +1,7 @@
 #ifndef __WINE_WINE_EXCEPTION_H
 #define __WINE_WINE_EXCEPTION_H
 
+#include <setjmp.h>
 #include <intrin.h>
 #include <pseh/pseh2.h>
 #include <pseh/excpt.h>
@@ -9,6 +10,21 @@
 extern "C" {
 #endif
 
+/* Win32 seems to use the same flags as ExceptionFlags in an EXCEPTION_RECORD */
+#define EH_NONCONTINUABLE   0x01
+#define EH_UNWINDING        0x02
+#define EH_EXIT_UNWIND      0x04
+#define EH_STACK_INVALID    0x08
+#define EH_NESTED_CALL      0x10
+
+#define EXCEPTION_WINE_STUB       0x80000100
+#define EXCEPTION_WINE_ASSERTION  0x80000101
+
+#define EXCEPTION_VM86_INTx       0x80000110
+#define EXCEPTION_VM86_STI        0x80000111
+#define EXCEPTION_VM86_PICRETURN  0x80000112
+
+#ifndef _RTLTYPES_H
 typedef EXCEPTION_DISPOSITION (*PEXCEPTION_HANDLER)
                (struct _EXCEPTION_RECORD*, void*, struct _CONTEXT*, void*);
 
@@ -20,6 +36,17 @@ struct _EXCEPTION_REGISTRATION_RECORD
     struct _EXCEPTION_REGISTRATION_RECORD * Prev;
     PEXCEPTION_HANDLER Handler;
 };
+#else
+typedef struct _WINE_EXCEPTION_REGISTRATION_RECORD
+{
+    PVOID Prev;
+    PEXCEPTION_ROUTINE Handler;
+} WINE_EXCEPTION_REGISTRATION_RECORD, *PWINE_EXCEPTION_REGISTRATION_RECORD;
+
+#define _EXCEPTION_REGISTRATION_RECORD _WINE_EXCEPTION_REGISTRATION_RECORD
+#define EXCEPTION_REGISTRATION_RECORD WINE_EXCEPTION_REGISTRATION_RECORD
+#define PEXCEPTION_REGISTRATION_RECORD PWINE_EXCEPTION_REGISTRATION_RECORD
+#endif
 
 #define __TRY _SEH2_TRY
 #define __EXCEPT(func) _SEH2_EXCEPT(func(_SEH2_GetExceptionInformation()))
@@ -40,31 +67,38 @@ struct _EXCEPTION_REGISTRATION_RECORD
 #define AbnormalTermination() _SEH2_AbnormalTermination()
 #endif
 
-/* Win32 seems to use the same flags as ExceptionFlags in an EXCEPTION_RECORD */
-#define EH_NONCONTINUABLE   0x01
-#define EH_UNWINDING        0x02
-#define EH_EXIT_UNWIND      0x04
-#define EH_STACK_INVALID    0x08
-#define EH_NESTED_CALL      0x10
-
-#define EXCEPTION_WINE_STUB       0x80000100
-#define EXCEPTION_WINE_ASSERTION  0x80000101
 
-#define EXCEPTION_VM86_INTx       0x80000110
-#define EXCEPTION_VM86_STI        0x80000111
-#define EXCEPTION_VM86_PICRETURN  0x80000112
+#if defined(__MINGW32__) || defined(__CYGWIN__)
+#define sigjmp_buf jmp_buf
+#define sigsetjmp(buf,sigs) setjmp(buf)
+#define siglongjmp(buf,val) longjmp(buf,val)
+#endif
 
 static inline EXCEPTION_REGISTRATION_RECORD *__wine_push_frame( EXCEPTION_REGISTRATION_RECORD *frame )
 {
+#ifdef __i386__
     frame->Prev = (struct _EXCEPTION_REGISTRATION_RECORD *)__readfsdword(0);
        __writefsdword(0, (unsigned long)frame);
     return frame->Prev;
+#else
+    NT_TIB *teb = (NT_TIB *)NtCurrentTeb();
+    frame->Prev = teb->ExceptionList;
+    teb->ExceptionList = frame;
+    return frame->Prev;
+#endif
 }
 
 static inline EXCEPTION_REGISTRATION_RECORD *__wine_pop_frame( EXCEPTION_REGISTRATION_RECORD *frame )
 {
+#ifdef __i386__
        __writefsdword(0, (unsigned long)frame->Prev);
     return frame->Prev;
+#else
+    NT_TIB *teb = (NT_TIB *)NtCurrentTeb();
+    frame->Prev = teb->ExceptionList;
+    teb->ExceptionList = frame;
+    return frame->Prev;
+#endif
 }
 
 extern void __wine_enter_vm86( CONTEXT *context );