msvcrt: fix non-c++ exception handling
Peter Beutner
p.beutner at gmx.net
Fri Oct 21 20:55:19 CDT 2005
If exception is not a CXX_EXCEPTION it comes without cxx_exception_type info so we cannot
use that to find a matching handler.Instead only search for a catch(...) block and fall
through if no exists.
Changelog:
- msvcrt: fix exception handling for non CXX_EXCEPTIONs
-------------- next part --------------
Index: dlls/msvcrt/cppexcept.c
===================================================================
RCS file: /home/wine/wine/dlls/msvcrt/cppexcept.c,v
retrieving revision 1.16
diff -p -u -r1.16 cppexcept.c
--- dlls/msvcrt/cppexcept.c 25 Sep 2005 15:23:21 -0000 1.16
+++ dlls/msvcrt/cppexcept.c 22 Oct 2005 00:55:38 -0000
@@ -260,13 +260,21 @@ inline static void *call_catch_block( PE
for (j = 0; j < tryblock->catchblock_count; j++)
{
catchblock_info *catchblock = &tryblock->catchblock[j];
- const cxx_type_info *type = find_caught_type( info, catchblock );
- if (!type) continue;
-
- TRACE( "matched type %p in tryblock %d catchblock %d\n", type, i, j );
-
- /* copy the exception to its destination on the stack */
- copy_exception( object, frame, catchblock, type );
+ if(info) {
+ const cxx_type_info *type = find_caught_type( info, catchblock );
+ if (!type) continue;
+
+ TRACE( "matched type %p in tryblock %d catchblock %d\n", type, i, j );
+
+ /* copy the exception to its destination on the stack */
+ copy_exception( object, frame, catchblock, type );
+ }
+ else {
+ /* no CXX_EXCEPTION only proceed with a catch(...) block*/
+ if(catchblock->type_info)
+ continue;
+ TRACE("found catch(...) block\n");
+ }
/* unwind the stack */
RtlUnwind( frame, 0, rec, 0 );
@@ -274,8 +282,8 @@ inline static void *call_catch_block( PE
frame->trylevel = tryblock->end_level + 1;
/* call the catch block */
- TRACE( "calling catch block %p for type %p addr %p ebp %p\n",
- catchblock, type, catchblock->handler, &frame->ebp );
+ TRACE( "calling catch block %p addr %p ebp %p\n",
+ catchblock, catchblock->handler, &frame->ebp );
/* setup an exception block for nested exceptions */
@@ -291,7 +299,7 @@ inline static void *call_catch_block( PE
thread_data->exc_record = nested_frame.prev_rec;
__wine_pop_frame( &nested_frame.frame );
- if (info->destructor) call_dtor( info->destructor, object );
+ if (info && info->destructor) call_dtor( info->destructor, object );
TRACE( "done, continuing at %p\n", addr );
return addr;
}
@@ -325,27 +333,32 @@ static DWORD cxx_frame_handler( PEXCEPTI
}
if (!descr->tryblock_count) return ExceptionContinueSearch;
- exc_type = (cxx_exception_type *)rec->ExceptionInformation[2];
- if (rec->ExceptionCode == CXX_EXCEPTION &&
- rec->ExceptionInformation[0] > CXX_FRAME_MAGIC &&
- exc_type->custom_handler)
- {
- return exc_type->custom_handler( rec, frame, exc_context, dispatch,
- descr, nested_trylevel, nested_frame, 0 );
- }
-
- if (!exc_type) /* nested exception, fetch info from original exception */
- {
- rec = msvcrt_get_thread_data()->exc_record;
+ if(rec->ExceptionCode == CXX_EXCEPTION) {
exc_type = (cxx_exception_type *)rec->ExceptionInformation[2];
- }
- if (TRACE_ON(seh))
- {
- TRACE("handling C++ exception rec %p frame %p trylevel %d descr %p nested_frame %p\n",
- rec, frame, frame->trylevel, descr, nested_frame );
- dump_exception_type( exc_type );
- dump_function_descr( descr, exc_type );
+ if (rec->ExceptionInformation[0] > CXX_FRAME_MAGIC &&
+ exc_type->custom_handler)
+ {
+ return exc_type->custom_handler( rec, frame, exc_context, dispatch,
+ descr, nested_trylevel, nested_frame, 0 );
+ }
+ if (!exc_type) /* nested exception, fetch info from original exception */
+ {
+ rec = msvcrt_get_thread_data()->exc_record;
+ exc_type = (cxx_exception_type *)rec->ExceptionInformation[2];
+ }
+ if (TRACE_ON(seh))
+ {
+ TRACE("handling C++ exception rec %p frame %p trylevel %d descr %p nested_frame %p\n",
+ rec, frame, frame->trylevel, descr, nested_frame );
+ dump_exception_type( exc_type );
+ dump_function_descr( descr, exc_type );
+ }
+ }
+ else {
+ exc_type = NULL;
+ TRACE("handling C exception code %lx rec %p frame %p trylevel %d descr %p nested_frame %p\n",
+ rec->ExceptionCode, rec, frame, frame->trylevel, descr, nested_frame );
}
next_ip = call_catch_block( rec, frame, descr, frame->trylevel, exc_type );
More information about the wine-patches
mailing list