From 9060c87badf86525e8032b9d116058ffca6dca1b Mon Sep 17 00:00:00 2001 From: "KJK::Hyperion" Date: Wed, 8 Jul 2009 19:52:48 +0000 Subject: [PATCH] modified include/reactos/libs/pseh/pseh2.h Only leave the frame in the outermost _SEH2_END (like in PSEH1) svn path=/trunk/; revision=41812 --- reactos/include/reactos/libs/pseh/pseh2.h | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/reactos/include/reactos/libs/pseh/pseh2.h b/reactos/include/reactos/libs/pseh/pseh2.h index 0523231c2f7..d2035358a38 100644 --- a/reactos/include/reactos/libs/pseh/pseh2.h +++ b/reactos/include/reactos/libs/pseh/pseh2.h @@ -194,16 +194,18 @@ void * _SEHClosureFromTrampoline(_SEHTrampoline_t * trampoline_) #define __SEH_ENTER_SCOPE(TRYLEVEL_) (_SEHTopTryLevel ? __SEH_ENTER_FRAME_AND_TRYLEVEL(TRYLEVEL_) : __SEH_ENTER_TRYLEVEL(TRYLEVEL_)) #define __SEH_ENTER_HANDLE_SCOPE(TRYLEVEL_, HANDLE_) (({ __SEH_BARRIER; __asm__ __volatile__("mov %%esp, %0" : "=m" ((TRYLEVEL_)->SHT_Esp)); __SEH_BARRIER; }), (_SEHTopTryLevel ? __SEH_ENTER_FRAME_AND_HANDLE_TRYLEVEL((TRYLEVEL_), (HANDLE_)) : __SEH_ENTER_HANDLE_TRYLEVEL((TRYLEVEL_), (HANDLE_)))) -#define __SEH_LEAVE_SCOPE() \ +#define __SEH_LEAVE_TRYLEVEL() \ + if(!_SEHTopTryLevel) \ + { \ + __SEH_SET_TRYLEVEL(_SEHPrevTryLevelP); \ + } \ + +#define __SEH_LEAVE_FRAME() \ if(_SEHTopTryLevel) \ { \ _SEH2LeaveFrame(); \ __asm__ __volatile__("mov %0, %%esp" : : "g" (_SEHStackPointer)); \ - } \ - else \ - { \ - __SEH_SET_TRYLEVEL(_SEHPrevTryLevelP); \ - } \ + } #define __SEH_END_SCOPE_CHAIN \ static __attribute__((unused)) const int _SEH2ScopeKind = 1; \ @@ -289,7 +291,7 @@ void * _SEHClosureFromTrampoline(_SEHTrampoline_t * trampoline_) \ _SEHAbnormalTermination = 0; \ \ - __SEH_LEAVE_SCOPE(); \ + __SEH_LEAVE_TRYLEVEL(); \ \ _SEHFinally(); \ goto _SEHEndExcept; \ @@ -362,7 +364,7 @@ void * _SEHClosureFromTrampoline(_SEHTrampoline_t * trampoline_) __attribute__((unused)) __SEH_DEFINE_FINALLY(_SEHFinally) { __SEH_RETURN_FINALLY(); } \ \ _SEHAfterTry:; \ - __SEH_LEAVE_SCOPE(); \ + __SEH_LEAVE_TRYLEVEL(); \ \ goto _SEHEndExcept; \ \ @@ -377,6 +379,8 @@ void * _SEHClosureFromTrampoline(_SEHTrampoline_t * trampoline_) } \ \ _SEHEndExcept:; \ + \ + __SEH_LEAVE_FRAME(); \ } \ __SEH_END_SCOPE;