Use _alloca instead of stack variables, because the compiler feels too damn smart

svn path=/trunk/; revision=11706
This commit is contained in:
KJK::Hyperion 2004-11-19 23:58:33 +00:00
parent c99ffa31ca
commit 34149e19fc

View file

@ -25,6 +25,7 @@
#include <pseh/framebased/internal.h> #include <pseh/framebased/internal.h>
#include <pseh/excpt.h> #include <pseh/excpt.h>
#include <malloc.h>
#ifndef offsetof #ifndef offsetof
# include <stddef.h> # include <stddef.h>
@ -98,26 +99,27 @@ static __declspec(noreturn) void __stdcall _SEHCompilerSpecificHandler
#define _SEH_TRY_FILTER_FINALLY(FILTER_, FINALLY_) \ #define _SEH_TRY_FILTER_FINALLY(FILTER_, FINALLY_) \
{ \ { \
static _SEHHandlers_t _SEHHandlers = \ static _SEHHandlers_t _SEHHandlers = \
{ \ { \
(NULL), \ (NULL), \
_SEHCompilerSpecificHandler, \ _SEHCompilerSpecificHandler, \
(NULL) \ (NULL) \
}; \ }; \
_SEHHandlers.SH_Filter = FILTER_; \ _SEHHandlers.SH_Filter = FILTER_; \
_SEHHandlers.SH_Finally = FINALLY_; \ _SEHHandlers.SH_Finally = FINALLY_; \
\ \
_SEHFrame_t _SEHFrame; \ _SEHFrame_t * _SEHFrame; \
volatile _SEHPortableFrame_t * _SEHPortableFrame; \ volatile _SEHPortableFrame_t * _SEHPortableFrame; \
\ \
_SEHFrame.SEH_Header.SPF_Handlers = &_SEHHandlers; \ _SEHFrame = _alloca(sizeof(_SEHFrame_t)); \
_SEHFrame->SEH_Header.SPF_Handlers = &_SEHHandlers; \
\ \
_SEHPortableFrame = &_SEHFrame.SEH_Header; \ _SEHPortableFrame = &_SEHFrame->SEH_Header; \
(void)_SEHPortableFrame; \ (void)_SEHPortableFrame; \
\ \
if(setjmp(_SEHFrame.SEH_JmpBuf) == 0) \ if(setjmp(_SEHFrame->SEH_JmpBuf) == 0) \
{ \ { \
_SEHEnter(&_SEHFrame.SEH_Header); \ _SEHEnter(&_SEHFrame->SEH_Header); \
\ \
do \ do \
{ {
@ -127,17 +129,17 @@ static __declspec(noreturn) void __stdcall _SEHCompilerSpecificHandler
} \ } \
while(0); \ while(0); \
\ \
_SEHLeave(&_SEHFrame.SEH_Header); \ _SEHLeave(&_SEHFrame->SEH_Header); \
} \ } \
else \ else \
{ \ { \
_SEHLeave(&_SEHFrame.SEH_Header); \ _SEHLeave(&_SEHFrame->SEH_Header); \
#define _SEH_END \ #define _SEH_END \
} \ } \
\ \
if(_SEHHandlers.SH_Finally) \ if(_SEHHandlers.SH_Finally) \
_SEHHandlers.SH_Finally(&_SEHFrame.SEH_Header); \ _SEHHandlers.SH_Finally(&_SEHFrame->SEH_Header); \
} }
#define _SEH_LEAVE break #define _SEH_LEAVE break