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