Implemented PSEH wrapper for native compiler SEH. Changed copyright
years
Modified: trunk/reactos/include/pseh/excpt.h
Modified: trunk/reactos/include/pseh/framebased/internal.h
Modified: trunk/reactos/include/pseh/framebased.h
Added: trunk/reactos/include/pseh/native.h
Modified: trunk/reactos/include/pseh/setjmp.h
Modified: trunk/reactos/include/pseh.h
_____
Modified: trunk/reactos/include/pseh/excpt.h
--- trunk/reactos/include/pseh/excpt.h 2005-03-27 00:53:15 UTC (rev
14340)
+++ trunk/reactos/include/pseh/excpt.h 2005-03-27 01:57:26 UTC (rev
14341)
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004 KJK::Hyperion
+ Copyright (c) 2004/2005 KJK::Hyperion
Permission is hereby granted, free of charge, to any person obtaining
a copy of
this software and associated documentation files (the "Software"), to
deal in
_____
Modified: trunk/reactos/include/pseh/framebased/internal.h
--- trunk/reactos/include/pseh/framebased/internal.h 2005-03-27
00:53:15 UTC (rev 14340)
+++ trunk/reactos/include/pseh/framebased/internal.h 2005-03-27
01:57:26 UTC (rev 14341)
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004 KJK::Hyperion
+ Copyright (c) 2004/2005 KJK::Hyperion
Permission is hereby granted, free of charge, to any person obtaining
a copy of
this software and associated documentation files (the "Software"), to
deal in
_____
Modified: trunk/reactos/include/pseh/framebased.h
--- trunk/reactos/include/pseh/framebased.h 2005-03-27 00:53:15 UTC
(rev 14340)
+++ trunk/reactos/include/pseh/framebased.h 2005-03-27 01:57:26 UTC
(rev 14341)
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004 KJK::Hyperion
+ Copyright (c) 2004/2005 KJK::Hyperion
Permission is hereby granted, free of charge, to any person obtaining
a copy of
this software and associated documentation files (the "Software"), to
deal in
@@ -33,7 +33,10 @@
/*
Fall back to non-optimal, non-native NLG implementation for
environments
- without their own (e.g., currently, kernel-mode ReactOS/Windows)
+ without their own (e.g., currently, kernel-mode ReactOS/Windows). THIS
IS NOT
+ RECOMMENDED AND IT WILL BE DROPPED IN A FUTURE VERSION BECAUSE IT MAY
CAUSE
+ SEVERE STACK CORRUPTION. REIMPLEMENT OR PORT YOUR COMPILER'S NATIVE
NLG
+ IMPLEMENTATION INSTEAD.
*/
#ifdef _SEH_NO_NATIVE_NLG
# include <pseh/setjmp.h>
_____
Added: trunk/reactos/include/pseh/native.h
--- trunk/reactos/include/pseh/native.h 2005-03-27 00:53:15 UTC (rev
14340)
+++ trunk/reactos/include/pseh/native.h 2005-03-27 01:57:26 UTC (rev
14341)
@@ -0,0 +1,242 @@
+/*
+ Copyright (c) 2004/2005 KJK::Hyperion
+
+ Permission is hereby granted, free of charge, to any person obtaining
a copy of
+ this software and associated documentation files (the "Software"), to
deal in
+ the Software without restriction, including without limitation the
rights to
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies
+ of the Software, and to permit persons to whom the Software is
furnished to do
+ so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be
included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE
+ SOFTWARE.
+*/
+
+#ifndef KJK_PSEH_NATIVE_H_
+#define KJK_PSEH_NATIVE_H_
+
+#include <excpt.h>
+#include <pseh/excpt.h>
+
+/*
+ Note: just define __inline to an empty symbol if your C compiler
doesn't
+ support it
+*/
+#ifdef __cplusplus
+# ifndef __inline
+# define __inline inline
+# endif
+#endif
+
+typedef long (__stdcall * _SEHFilter_t)
+(
+ long,
+ struct _EXCEPTION_POINTERS *,
+ void *
+);
+
+typedef void (__stdcall * _SEHFinally_t)
+(
+ int,
+ void *
+);
+
+static __inline long _SEHCallFilter
+(
+ _SEHFilter_t _SEHFilter,
+ long _SEHExceptionCode,
+ struct _EXCEPTION_POINTERS * _SEHExceptionPointers,
+ void * _SEHPVLocals
+)
+{
+ if(_SEHFilter == _SEH_STATIC_FILTER(_SEH_EXECUTE_HANDLER))
+ return _SEH_EXECUTE_HANDLER;
+ else if(_SEHFilter == _SEH_STATIC_FILTER(_SEH_CONTINUE_SEARCH))
+ return _SEH_CONTINUE_SEARCH;
+ else if(_SEHFilter == _SEH_STATIC_FILTER(_SEH_CONTINUE_EXECUTION))
+ return _SEH_CONTINUE_EXECUTION;
+ else if(_SEHFilter)
+ return _SEHFilter(_SEHExceptionCode, _SEHExceptionPointers,
_SEHPVLocals);
+ else
+ return _SEH_CONTINUE_SEARCH;
+}
+
+static __inline void _SEHCallFinally
+(
+ _SEHFinally_t _SEHFinally,
+ int _SEHAbnormalTermination,
+ void * _SEHPVLocals
+)
+{
+ if(_SEHFinally)
+ (_SEHFinally)(_SEHAbnormalTermination, _SEHPVLocals);
+}
+
+/* SHARED LOCALS */
+/* Access the locals for the current frame */
+#define _SEH_ACCESS_LOCALS(LOCALS_) \
+ _SEH_LOCALS_TYPENAME(LOCALS_) * _SEHPLocals; \
+ _SEHPLocals = _SEH_PVOID_CAST(_SEH_LOCALS_TYPENAME(LOCALS_) *,
_SEHPVLocals);
+
+/* Access local variable VAR_ */
+#define _SEH_VAR(VAR_) _SEHPLocals->VAR_
+
+/* FILTER FUNCTIONS */
+/* Declares a filter function's prototype */
+#define _SEH_FILTER(NAME_) \
+ long __stdcall NAME_ \
+ ( \
+ long _SEHExceptionCode, \
+ struct _EXCEPTION_POINTERS * _SEHExceptionPointers, \
+ void * _SEHPVLocals \
+ )
+
+/* Declares a static filter */
+#define _SEH_STATIC_FILTER(ACTION_) ((_SEHFilter_t)((ACTION_) + 2))
+
+/* Declares a PSEH filter wrapping a regular filter function */
+#define _SEH_WRAP_FILTER(WRAPPER_, NAME_) \
+ static __inline _SEH_FILTER(WRAPPER_) \
+ { \
+ return (NAME_)(_SEHExceptionPointers); \
+ }
+
+/* FINALLY FUNCTIONS */
+/* Declares a finally function's prototype */
+#define _SEH_FINALLY(NAME_) \
+ void __stdcall NAME_ \
+ ( \
+ int _SEHAbnormalTermination, \
+ void * _SEHPVLocals \
+ )
+
+/* Declares a PSEH finally function wrapping a regular function */
+#define _SEH_WRAP_FINALLY(WRAPPER_, NAME_) \
+ _SEH_WRAP_FINALLY_ARGS(WRAPPER_, NAME_, ())
+
+#define _SEH_WRAP_FINALLY_ARGS(WRAPPER_, NAME_, ARGS_) \
+ static __inline _SEH_FINALLY(WRAPPER_) \
+ { \
+ NAME_ ARGS_; \
+ }
+
+#define _SEH_WRAP_FINALLY_LOCALS_ARGS(WRAPPER_, LOCALS_, NAME_, ARGS_)
\
+ static __inline _SEH_FINALLY(WRAPPER_) \
+ { \
+ _SEH_ACCESS_LOCALS(LOCALS_); \
+ NAME_ ARGS_; \
+ }
+
+/* SAFE BLOCKS */
+#define _SEH_TRY_FINALLY(FINALLY_) \
+ _SEH_TRY_FILTER_FINALLY \
+ ( \
+ _SEH_STATIC_FILTER(_SEH_CONTINUE_SEARCH), \
+ (FINALLY_) \
+ )
+
+#define _SEH_END_FINALLY _SEH_HANDLE _SEH_END
+
+#define _SEH_TRY_FILTER(FILTER_) \
+ _SEH_TRY_FILTER_FINALLY((FILTER_), NULL)
+
+#define _SEH_TRY_HANDLE_FINALLY(FINALLY_) \
+ _SEH_TRY_FILTER_FINALLY \
+ ( \
+ _SEH_STATIC_FILTER(_SEH_EXECUTE_HANDLER), \
+ (FINALLY_) \
+ )
+
+#define _SEH_TRY \
+ _SEH_TRY_HANDLE_FINALLY(NULL)
+
+#define _SEH_CALL_FILTER(FILTER_) \
+ _SEHCallFilter
\
+ (
\
+ (FILTER_),
\
+ GetExceptionCode(),
\
+ GetExceptionPointers(),
\
+ _SEHPVLocals
\
+ )
+
+#define _SEH_CALL_FINALLY(FINALLY_) \
+ _SEHCallFinally((FINALLY_), (AbnormalTermination() != 0),
_SEHPVLocals)
+
+#define _SEH_TRY_FILTER_FINALLY(FILTER_, FINALLY_) \
+ __try
\
+ {
\
+ _SEHFinally_t _SEHFinally = (FINALLY_);
\
+ _SEHFilter_t _SEHFilter = (FILTER_);
\
+ void * _SEHPVLocals = &_SEHLocals;
\
+ (void)_SEHPVLocals;
\
+
\
+ __try
\
+ {
+
+#define _SEH_HANDLE \
+ }
\
+ __except(_SEH_CALL_FILTER(_SEHFilter))
\
+ {
\
+ struct _EXCEPTION_POINTERS * _SEHExceptionPointers =
GetExceptionPointers();\
+ long _SEHExceptionCode = GetExceptionCode();
\
+
+#define _SEH_END \
+ }
\
+ }
\
+ __finally
\
+ {
\
+ _SEH_CALL_FINALLY(_SEHFinally);
\
+ }
+
+#define _SEH_LEAVE __leave
+
+#define _SEH_GetExceptionCode() (_SEHExceptionCode)
+#define _SEH_GetExceptionPointers() (_SEHExceptionPointers)
+#define _SEH_AbnormalTermination() (_SEHAbnormalTermination)
+
+/* New syntax */
+
+#define _SEH2_TRY \
+ {
\
+ void * _SEHPVLocals = &_SEHLocals;
\
+ (void)_SEHPVLocals;
\
+
\
+ __try
\
+ {
+
+#define _SEH2_EXCEPT(FILTER_) \
+ }
\
+ __except(_SEH_CALL_FILTER(FILTER_))
\
+ {
\
+ struct _EXCEPTION_POINTERS * _SEHExceptionPointers =
GetExceptionPointers();\
+ long _SEHExceptionCode = GetExceptionCode();
\
+
+#define _SEH2_FINALLY(FINALLY_) \
+ }
\
+ __finally
\
+ {
\
+ _SEH_CALL_FINALLY(FINALLY_)
+
+#define _SEH2_END \
+ }
\
+ }
+
+#define _SEH2_HANDLE
_SEH2_EXCEPT(_SEH_STATIC_FILTER(_SEH_EXECUTE_HANDLER))
+
+#define _SEH2_LEAVE _SEH_LEAVE
+
+#define _SEH2_GetExceptionCode _SEH_GetExceptionCode
+#define _SEH2_GetExceptionPointers _SEH_GetExceptionPointers
+#define _SEH2_AbnormalTermination _SEH_AbnormalTermination
+
+#endif
+
+/* EOF */
_____
Modified: trunk/reactos/include/pseh/setjmp.h
--- trunk/reactos/include/pseh/setjmp.h 2005-03-27 00:53:15 UTC (rev
14340)
+++ trunk/reactos/include/pseh/setjmp.h 2005-03-27 01:57:26 UTC (rev
14341)
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004 KJK::Hyperion
+ Copyright (c) 2004/2005 KJK::Hyperion
Permission is hereby granted, free of charge, to any person obtaining
a copy of
this software and associated documentation files (the "Software"), to
deal in
_____
Modified: trunk/reactos/include/pseh.h
--- trunk/reactos/include/pseh.h 2005-03-27 00:53:15 UTC (rev
14340)
+++ trunk/reactos/include/pseh.h 2005-03-27 01:57:26 UTC (rev
14341)
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2004 KJK::Hyperion
+ Copyright (c) 2004/2005 KJK::Hyperion
Permission is hereby granted, free of charge, to any person obtaining
a copy of
this software and associated documentation files (the "Software"), to
deal in
@@ -67,7 +67,6 @@
static _SEH_LOCALS_TYPENAME(_SEHDummyLocals) { int Dummy_; }
_SEHLocals;
static void __inline _SEHDummyLocalsUser(void) { (void)_SEHLocals; }
-/* TODO: <pseh/native.h> to wrap native SEH implementations */
#include <pseh/framebased.h>
#endif