ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

framebased.h
Go to the documentation of this file.
00001 /*
00002     Copyright (c) 2004/2005 KJK::Hyperion
00003 
00004     Permission is hereby granted, free of charge, to any person obtaining a
00005     copy of this software and associated documentation files (the "Software"),
00006     to deal in the Software without restriction, including without limitation
00007     the rights to use, copy, modify, merge, publish, distribute, sublicense,
00008     and/or sell copies of the Software, and to permit persons to whom the
00009     Software is furnished to do so, subject to the following conditions:
00010 
00011     The above copyright notice and this permission notice shall be included in
00012     all copies or substantial portions of the Software.
00013 
00014     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
00015     IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
00016     FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
00017     AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
00018     LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
00019     FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
00020     DEALINGS IN THE SOFTWARE.
00021 */
00022 
00023 #ifndef KJK_PSEH_FRAMEBASED_H_
00024 #define KJK_PSEH_FRAMEBASED_H_
00025 
00026 #if ((__GNUC__ > 4) && (__GNUC_MINOR__ > 1))
00027 /* warning: this will hide uninitialized variable warnings in the following code */
00028 #  pragma GCC diagnostic ignored "-Wuninitialized"
00029 #endif
00030 
00031 #include <pseh/framebased/internal.h>
00032 #include <pseh/excpt.h>
00033 
00034 #ifndef offsetof
00035 #   include <stddef.h>
00036 #endif
00037 
00038 #if defined(_SEH_NO_NATIVE_NLG)
00039 #   error PSEH setjmp/longjmp fallback is no longer supported
00040 #endif
00041 
00042 #if defined(__GNUC__)
00043 #   define _SEHLongJmp __builtin_longjmp
00044 #   define _SEHSetJmp __builtin_setjmp
00045     typedef void * _SEHJmpBuf_t[5];
00046 #else
00047 #   include <setjmp.h>
00048 #   define _SEHLongJmp longjmp
00049 #   define _SEHSetJmp setjmp
00050 #   define _SEHJmpBuf_t jmp_buf
00051 #endif
00052 
00053 #ifdef __cplusplus
00054 #   define _SEH_INIT_CONST static const
00055 #else
00056 #   define _SEH_INIT_CONST register const
00057 #endif
00058 
00059 typedef struct __SEHFrame
00060 {
00061     _SEHPortableFrame_t SEH_Header;
00062     void * volatile SEH_Locals;
00063 }
00064 _SEHFrame_t;
00065 
00066 typedef struct __SEHTryLevel
00067 {
00068     _SEHPortableTryLevel_t ST_Header;
00069     _SEHJmpBuf_t ST_JmpBuf;
00070 }
00071 _SEHTryLevel_t;
00072 
00073 static __declspec(noreturn) __inline void __stdcall _SEHCompilerSpecificHandler
00074 (
00075     _SEHPortableTryLevel_t * trylevel
00076 )
00077 {
00078     _SEHTryLevel_t * mytrylevel;
00079     mytrylevel = _SEH_CONTAINING_RECORD(trylevel, _SEHTryLevel_t, ST_Header);
00080     _SEHLongJmp(mytrylevel->ST_JmpBuf, 1);
00081 }
00082 
00083 static const int _SEHScopeKind = 1;
00084 static _SEHPortableFrame_t * const _SEHPortableFrame = 0;
00085 static _SEHPortableTryLevel_t * const _SEHPortableTryLevel = 0;
00086 
00087 /* SHARED LOCALS */
00088 /* Access the locals for the current frame */
00089 #define _SEH_ACCESS_LOCALS(LOCALS_) \
00090     _SEH_LOCALS_TYPENAME(LOCALS_) * _SEHPLocals; \
00091     _SEHPLocals = \
00092         _SEH_PVOID_CAST \
00093         ( \
00094             _SEH_LOCALS_TYPENAME(LOCALS_) *, \
00095             _SEH_CONTAINING_RECORD(_SEHPortableFrame, _SEHFrame_t, SEH_Header) \
00096                 ->SEH_Locals \
00097         );
00098 
00099 /* Access local variable VAR_ */
00100 #define _SEH_VAR(VAR_) _SEHPLocals->VAR_
00101 
00102 /* FILTER FUNCTIONS */
00103 /* Declares a filter function's prototype */
00104 #define _SEH_FILTER(NAME_) \
00105     long __stdcall NAME_ \
00106     ( \
00107         struct _EXCEPTION_POINTERS * _SEHExceptionPointers, \
00108         struct __SEHPortableFrame * _SEHPortableFrame \
00109     )
00110 
00111 /* Declares a static filter */
00112 #define _SEH_STATIC_FILTER(ACTION_) ((_SEHFilter_t)((ACTION_) + 2))
00113 
00114 /* Declares a PSEH filter wrapping a regular filter function */
00115 #define _SEH_WRAP_FILTER(WRAPPER_, NAME_) \
00116     static __inline _SEH_FILTER(WRAPPER_) \
00117     { \
00118         return (NAME_)(_SEHExceptionPointers); \
00119     }
00120 
00121 /* FINALLY FUNCTIONS */
00122 /* Declares a finally function's prototype */
00123 #define _SEH_FINALLYFUNC(NAME_) \
00124     void __stdcall NAME_ \
00125     ( \
00126         struct __SEHPortableFrame * _SEHPortableFrame \
00127     )
00128 
00129 /* Declares a PSEH finally function wrapping a regular function */
00130 #define _SEH_WRAP_FINALLY(WRAPPER_, NAME_) \
00131     _SEH_WRAP_FINALLY_ARGS(WRAPPER_, NAME_, ())
00132 
00133 #define _SEH_WRAP_FINALLY_ARGS(WRAPPER_, NAME_, ARGS_) \
00134     static __inline _SEH_FINALLYFUNC(WRAPPER_) \
00135     { \
00136         NAME_ ARGS_; \
00137     }
00138 
00139 #define _SEH_WRAP_FINALLY_LOCALS_ARGS(WRAPPER_, LOCALS_, NAME_, ARGS_) \
00140     static __inline _SEH_FINALLYFUNC(WRAPPER_) \
00141     { \
00142         _SEH_ACCESS_LOCALS(LOCALS_); \
00143         NAME_ ARGS_; \
00144     }
00145 
00146 /* SAFE BLOCKS */
00147 #ifdef __cplusplus
00148 #   define _SEH_DECLARE_HANDLERS(FILTER_, FINALLY_) \
00149         static const _SEHHandlers_t _SEHHandlers = { (FILTER_), (FINALLY_) };
00150 #else
00151 #   define _SEH_DECLARE_HANDLERS(FILTER_, FINALLY_) \
00152         _SEHHandlers_t _SEHHandlers = { (0), (0) }; \
00153         _SEHHandlers.SH_Filter = (FILTER_); \
00154         _SEHHandlers.SH_Finally = (FINALLY_);
00155 #endif
00156 
00157 #define _SEH_SetExceptionCode(CODE_) (_SEHPortableFrame->SPF_Code = (CODE_))
00158 #define _SEH_GetExceptionCode() (unsigned long)(_SEHPortableFrame->SPF_Code)
00159 
00160 #define _SEH_GetExceptionPointers() \
00161     ((struct _EXCEPTION_POINTERS *)_SEHExceptionPointers)
00162 
00163 #define _SEH_AbnormalTermination() (_SEHPortableFrame->SPF_Code != 0)
00164 
00165 #define _SEH_LEAVE break
00166 
00167 #define _SEH_YIELD(STMT_) \
00168     for(;;) \
00169     { \
00170         if(!_SEHScopeKind) \
00171             _SEHReturn(); \
00172     \
00173         STMT_; \
00174     }
00175 
00176 #ifdef _ARM_
00177 
00178 #define _SEH_TRY \
00179     for(;;) \
00180     { \
00181          \
00182         { \
00183     \
00184             for(;;) \
00185             { \
00186                 if(1) \
00187                 { \
00188                     for(;;) \
00189                     { \
00190                         {
00191 
00192 #define _SEH_EXCEPT(FILTER_) \
00193                         } \
00194     \
00195                         break; \
00196                     } \
00197     \
00198                     break; \
00199                 } \
00200                 else \
00201                 { \
00202                     { \
00203                         break; \
00204                     } \
00205                 } \
00206     \
00207                 break; \
00208             } \
00209     \
00210     \
00211             if(0) \
00212             {
00213 
00214 #define _SEH_FINALLY(FINALLY_) \
00215                         } \
00216     \
00217                         break; \
00218                     } \
00219     \
00220                     break; \
00221                 } \
00222                 else \
00223                 { \
00224                 } \
00225     \
00226                 break; \
00227             } \
00228     \
00229             (FINALLY_)(&_SEHFrame.SEH_Header); \
00230     \
00231             if(0) \
00232             {
00233 
00234 #define _SEH_END \
00235             } \
00236         } \
00237     \
00238     \
00239         break; \
00240     }
00241 
00242 #else
00243 
00244 #define _SEH_TRY \
00245     for(;;) \
00246     { \
00247         _SEH_INIT_CONST int _SEHTopTryLevel = (_SEHScopeKind != 0); \
00248         _SEHPortableFrame_t * const _SEHCurPortableFrame = _SEHPortableFrame; \
00249         _SEHPortableTryLevel_t * const _SEHPrevPortableTryLevel = _SEHPortableTryLevel; \
00250      \
00251         { \
00252             _SEH_INIT_CONST int _SEHScopeKind = 0; \
00253             register int _SEHState = 0; \
00254             register int _SEHHandle = 0; \
00255             _SEHFrame_t _SEHFrame; \
00256             _SEHTryLevel_t _SEHTryLevel; \
00257             _SEHPortableFrame_t * const _SEHPortableFrame = \
00258                 _SEHTopTryLevel ? &_SEHFrame.SEH_Header : _SEHCurPortableFrame; \
00259             _SEHPortableTryLevel_t * const _SEHPortableTryLevel = &_SEHTryLevel.ST_Header; \
00260     \
00261             (void)_SEHScopeKind; \
00262             (void)_SEHPortableFrame; \
00263             (void)_SEHPortableTryLevel; \
00264             (void)_SEHHandle; \
00265     \
00266             for(;;) \
00267             { \
00268                 if(_SEHState) \
00269                 { \
00270                     for(;;) \
00271                     { \
00272                         {
00273 
00274 #define _SEH_EXCEPT(FILTER_) \
00275                         } \
00276     \
00277                         break; \
00278                     } \
00279     \
00280                     break; \
00281                 } \
00282                 else \
00283                 { \
00284                     if((_SEHHandle = _SEHSetJmp(_SEHTryLevel.ST_JmpBuf)) == 0) \
00285                     { \
00286                         _SEHTryLevel.ST_Header.SPT_Handlers.SH_Filter = (FILTER_); \
00287                         _SEHTryLevel.ST_Header.SPT_Handlers.SH_Finally = 0; \
00288     \
00289                         _SEHTryLevel.ST_Header.SPT_Next = _SEHPrevPortableTryLevel; \
00290                         _SEHFrame.SEH_Header.SPF_TopTryLevel = &_SEHTryLevel.ST_Header; \
00291     \
00292                         if(_SEHTopTryLevel) \
00293                         { \
00294                             if(&_SEHLocals != _SEHDummyLocals) \
00295                                 _SEHFrame.SEH_Locals = &_SEHLocals; \
00296     \
00297                             _SEH_EnableTracing(_SEH_DO_DEFAULT_TRACING); \
00298                             _SEHFrame.SEH_Header.SPF_Handler = _SEHCompilerSpecificHandler; \
00299                             _SEHEnterFrame(&_SEHFrame.SEH_Header); \
00300                         } \
00301     \
00302                         ++ _SEHState; \
00303                         continue; \
00304                     } \
00305                     else \
00306                     { \
00307                         break; \
00308                     } \
00309                 } \
00310     \
00311                 break; \
00312             } \
00313     \
00314             _SEHPortableFrame->SPF_TopTryLevel = _SEHPrevPortableTryLevel; \
00315     \
00316             if(_SEHHandle) \
00317             {
00318 
00319 #define _SEH_FINALLY(FINALLY_) \
00320                         } \
00321     \
00322                         break; \
00323                     } \
00324     \
00325                     _SEHPortableFrame->SPF_TopTryLevel = _SEHPrevPortableTryLevel; \
00326                     break; \
00327                 } \
00328                 else \
00329                 { \
00330                     _SEHTryLevel.ST_Header.SPT_Handlers.SH_Filter = 0; \
00331                     _SEHTryLevel.ST_Header.SPT_Handlers.SH_Finally = (FINALLY_); \
00332     \
00333                     _SEHTryLevel.ST_Header.SPT_Next = _SEHPrevPortableTryLevel; \
00334                     _SEHFrame.SEH_Header.SPF_TopTryLevel = &_SEHTryLevel.ST_Header; \
00335     \
00336                     if(_SEHTopTryLevel) \
00337                     { \
00338                         if(&_SEHLocals != _SEHDummyLocals) \
00339                             _SEHFrame.SEH_Locals = &_SEHLocals; \
00340     \
00341                         _SEH_EnableTracing(_SEH_DO_DEFAULT_TRACING); \
00342                         _SEHFrame.SEH_Header.SPF_Handler = _SEHCompilerSpecificHandler; \
00343                         _SEHEnterFrame(&_SEHFrame.SEH_Header); \
00344                     } \
00345     \
00346                     ++ _SEHState; \
00347                     continue; \
00348                 } \
00349     \
00350                 break; \
00351             } \
00352     \
00353             (FINALLY_)(&_SEHFrame.SEH_Header); \
00354     \
00355             if(0) \
00356             {
00357 
00358 #define _SEH_END \
00359             } \
00360         } \
00361     \
00362         if(_SEHTopTryLevel) \
00363             _SEHLeaveFrame(); \
00364     \
00365         break; \
00366     }
00367 
00368 #endif
00369 
00370 #define _SEH_HANDLE _SEH_EXCEPT(_SEH_STATIC_FILTER(_SEH_EXECUTE_HANDLER))
00371 
00372 #define _SEH_EnableTracing(LEVEL_) ((void)(_SEHPortableFrame->SPF_Tracing = (LEVEL_)))
00373 #define _SEH_DisableTracing() ((void)(_SEHPortableFrame->SPF_Tracing = _SEH_DO_TRACE_NONE))
00374 
00375 #endif
00376 
00377 /* EOF */

Generated on Sat May 26 2012 04:32:04 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.