Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenframebased.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
1.7.6.1
|