msvcrt: Use exception base to create copy constructor pointer.

The exception base (exc_base) from the ExceptionRecord is used in
find_caught_type to find the type info for the exception. All related
type information is relative to this base, including the offset for
the copy constructor.

Signed-off-by: Daniel Lehman <dlehman@esri.com>
Signed-off-by: Piotr Caban <piotr@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Daniel Lehman 2017-09-08 10:32:07 -07:00 committed by Alexandre Julliard
parent 78ab8aa46a
commit 3ea70fa1e2
1 changed files with 4 additions and 4 deletions

View File

@ -248,7 +248,7 @@ static const cxx_type_info *find_caught_type(cxx_exception_type *exc_type, ULONG
static inline void copy_exception(void *object, ULONG64 frame, static inline void copy_exception(void *object, ULONG64 frame,
DISPATCHER_CONTEXT *dispatch, DISPATCHER_CONTEXT *dispatch,
const catchblock_info *catchblock, const catchblock_info *catchblock,
const cxx_type_info *type) const cxx_type_info *type, ULONG64 exc_base)
{ {
const type_info *catch_ti = rva_to_ptr(catchblock->type_info, dispatch->ImageBase); const type_info *catch_ti = rva_to_ptr(catchblock->type_info, dispatch->ImageBase);
void **dest = rva_to_ptr(catchblock->offset, frame); void **dest = rva_to_ptr(catchblock->offset, frame);
@ -273,13 +273,13 @@ static inline void copy_exception(void *object, ULONG64 frame,
if (type->flags & CLASS_HAS_VIRTUAL_BASE_CLASS) if (type->flags & CLASS_HAS_VIRTUAL_BASE_CLASS)
{ {
void (__cdecl *copy_ctor)(void*, void*, int) = void (__cdecl *copy_ctor)(void*, void*, int) =
rva_to_ptr(type->copy_ctor, dispatch->ImageBase); rva_to_ptr(type->copy_ctor, exc_base);
copy_ctor(dest, get_this_pointer(&type->offsets, object), 1); copy_ctor(dest, get_this_pointer(&type->offsets, object), 1);
} }
else else
{ {
void (__cdecl *copy_ctor)(void*, void*) = void (__cdecl *copy_ctor)(void*, void*) =
rva_to_ptr(type->copy_ctor, dispatch->ImageBase); rva_to_ptr(type->copy_ctor, exc_base);
copy_ctor(dest, get_this_pointer(&type->offsets, object)); copy_ctor(dest, get_this_pointer(&type->offsets, object));
} }
} }
@ -462,7 +462,7 @@ static inline void find_catch_block(EXCEPTION_RECORD *rec, EXCEPTION_RECORD *unt
/* copy the exception to its destination on the stack */ /* copy the exception to its destination on the stack */
copy_exception((void*)rec->ExceptionInformation[1], copy_exception((void*)rec->ExceptionInformation[1],
orig_frame, dispatch, catchblock, type); orig_frame, dispatch, catchblock, type, exc_base);
} }
else else
{ {