New syntax for PSEH. UNTESTED, any takers? It can be used like this:
_SEH2_TRY
{
// Code that might raise an exception
}
_SEH2_EXCEPT(FilterFunc)
{
// Handle the exception
}
_SEH2_END;
or like this:
_SEH2_TRY
{
// Code that might raise an exception
}
_SEH2_FINALLY(UnwindFunc)
_SEH2_END;
or even like this (but PLEASE forget I said it):
_SEH2_TRY
{
// Code that might raise an exception
}
_SEH2_EXCEPT(FilterFunc)
{
// Handle the exception
}
_SEH2_FINALLY(UnwindFunc)
_SEH2_END;
_SEH2_TRY
{
// Code that might raise an exception
}
_SEH2_END;
Modified: trunk/reactos/include/pseh/framebased.h
_____
Modified: trunk/reactos/include/pseh/framebased.h
--- trunk/reactos/include/pseh/framebased.h 2005-03-26 22:10:04 UTC
(rev 14337)
+++ trunk/reactos/include/pseh/framebased.h 2005-03-27 00:41:31 UTC
(rev 14338)
@@ -215,6 +215,89 @@
#define _SEH_LEAVE break
+/* New syntax */
+#define _SEH2_STATE_INIT_EXCEPT (1)
+#define _SEH2_STATE_INIT_FINALLY (_SEH2_STATE_INIT_EXCEPT + 1)
+#define _SEH2_STATE_BODY (_SEH2_STATE_INIT_FINALLY + 1)
+#define _SEH2_STATE_HANDLER (_SEH2_STATE_BODY + 1)
+#define _SEH2_STATE_DONE (_SEH2_STATE_HANDLER + 1)
+
+#define _SEH2_TRY \
+{
\
+ int _SEH2State;
\
+ _SEHFilter_t _SEH2Filter;
\
+ _SEHFinally_t _SEH2Finally;
\
+
\
+ _SEHFrame_t * _SEHFrame;
\
+ volatile _SEHPortableFrame_t * _SEHPortableFrame;
\
+
\
+ for(_SEH2State = 0; _SEH2State < _SEH2_STATE_DONE; ++ _SEH2State)
\
+ {
\
+ switch(_SEH2State)
\
+ {
\
+ case _SEH2_STATE_BODY:
\
+ {
\
+ _SEH_DECLARE_HANDLERS(_SEH2Filter, _SEH2Finally);
\
+
\
+ _SEHFrame = _alloca(sizeof(_SEHFrame_t));
\
+ _SEHFrame->SEH_Header.SPF_Handlers = &_SEHHandlers;
\
+ _SEHFrame->SEH_Locals = &_SEHLocals;
\
+
\
+ _SEHPortableFrame = &_SEHFrame->SEH_Header;
\
+ (void)_SEHPortableFrame;
\
+
\
+ if(_SEHSetJmp(_SEHFrame->SEH_JmpBuf))
\
+ break;
\
+
\
+ _SEHEnter(&_SEHFrame->SEH_Header);
+
+#define _SEH2_EXCEPT(FILTER_) \
+ _SEHLeave(&_SEHFrame->SEH_Header);
\
+ _SEH2State = _SEH2_STATE_DONE;
\
+
\
+ break;
\
+ }
\
+
\
+ case _SEH2_STATE_INIT_EXCEPT:
\
+ {
\
+ _SEH2Filter = (FILTER_);
\
+ break;
\
+ }
\
+
\
+ case _SEH2_STATE_HANDLER:
\
+ {
\
+ _SEHLeave(&_SEHFrame->SEH_Header);
+
+#define _SEH2_FINALLY(FINALLY_) \
+ break;
\
+ }
\
+
\
+ case _SEH2_STATE_INIT_FINALLY:
\
+ {
\
+ _SEH2Finally = (FINALLY_);
+
+#define _SEH2_END \
+ break;
\
+ }
\
+
\
+ default:
\
+ {
\
+ switch(state)
\
+ {
\
+ case _SEH2_STATE_INIT_EXCEPT: _SEH2Filter = NULL; break;
\
+ case _SEH2_STATE_INIT_FINALLY: _SEH2Finally = NULL; break;
\
+ case _SEH2_STATE_HANDLER: _SEHLeave(&_SEHFrame->SEH_Header);
break; \
+ }
\
+
\
+ break;
\
+ }
\
+ }
\
+ }
\
+
\
+ if(_SEHHandlers.SH_Finally)
\
+ _SEHHandlers.SH_Finally(&_SEHFrame->SEH_Header);
\
+}
+
#define _SEH_GetExceptionCode() (unsigned
long)(_SEHPortableFrame->SPF_Code)
#define _SEH_GetExceptionPointers() \