Daniel Lehman : msvcrt: Use exception base to create copy constructor pointer.
Alexandre Julliard
julliard at winehq.org
Mon Sep 11 15:08:00 CDT 2017
Module: wine
Branch: master
Commit: 3ea70fa1e2c37df94c6c89e15d8f8fc06bbb22e3
URL: http://source.winehq.org/git/wine.git/?a=commit;h=3ea70fa1e2c37df94c6c89e15d8f8fc06bbb22e3
Author: Daniel Lehman <dlehman at esri.com>
Date: Fri Sep 8 10:32:07 2017 -0700
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 at esri.com>
Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/msvcrt/except_x86_64.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/dlls/msvcrt/except_x86_64.c b/dlls/msvcrt/except_x86_64.c
index 7e9c38d..0820aad 100644
--- a/dlls/msvcrt/except_x86_64.c
+++ b/dlls/msvcrt/except_x86_64.c
@@ -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,
DISPATCHER_CONTEXT *dispatch,
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);
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)
{
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);
}
else
{
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));
}
}
@@ -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_exception((void*)rec->ExceptionInformation[1],
- orig_frame, dispatch, catchblock, type);
+ orig_frame, dispatch, catchblock, type, exc_base);
}
else
{
More information about the wine-cvs
mailing list