From 84a13923a5a15e22e2a53cc577e676be61dffec6 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Mon, 31 Jan 2011 22:10:17 +0000 Subject: [PATCH] [CRT] Implement call_finally_block, call_filter and call_unwind_func for MSVC svn path=/branches/cmake-bringup/; revision=50583 --- lib/sdk/crt/except/except.c | 51 +++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/lib/sdk/crt/except/except.c b/lib/sdk/crt/except/except.c index 663677776fd..af143593527 100644 --- a/lib/sdk/crt/except/except.c +++ b/lib/sdk/crt/except/except.c @@ -96,6 +96,57 @@ static inline int call_unwind_func( int (*func)(void), void *ebp ) : "ecx", "edx", "memory" ); return ret; } +#elif defined(_MSC_VER) +#pragma warning(push) +#pragma warning(disable:4731) // Don't complain about changing ebp +void __inline call_finally_block( void *code_block, void *base_ptr ) +{ + __asm + { + mov eax, code_block + mov ebp, base_ptr + call [eax] + } +} + +int __inline call_filter( int (*func)(PEXCEPTION_POINTERS), void *arg, void *_ebp ) +{ + int _ret; + __asm + { + push ebp + mov eax, arg + push eax + mov ebp, _ebp + mov eax, func + call [eax] + mov _ret, eax + pop ebp + pop ebp + } + return _ret; +} +int __inline call_unwind_func( int (*func)(void), void *_ebp ) +{ + int _ret; + + __asm + { + push ebp + push ebx + push esi + push edi + mov ebp, _ebp + call dword ptr [func] + mov _ret, eax + pop edi + pop esi + pop ebx + pop ebp + } + return _ret; +} +#pragma warning(pop) #endif static DWORD MSVCRT_nested_handler(PEXCEPTION_RECORD rec,