Piotr Caban : msvcrt: Add __ExceptionPtrCopyException implementation.

Alexandre Julliard julliard at winehq.org
Thu Jul 20 12:11:28 CDT 2017


Module: wine
Branch: stable
Commit: 410d97293caaa71c46fdac3daafcb6c7958e34e7
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=410d97293caaa71c46fdac3daafcb6c7958e34e7

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Thu Feb 23 13:24:47 2017 +0100

msvcrt: Add __ExceptionPtrCopyException implementation.

Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
(cherry picked from commit 15b144b35dfebbe334fb00220edc0393b8d1e84c)
Signed-off-by: Michael Stefaniuc <mstefani at winehq.org>

---

 dlls/msvcp140/msvcp140.spec         |  4 +-
 dlls/msvcr100/msvcr100.spec         |  4 +-
 dlls/msvcr110/msvcr110.spec         |  4 +-
 dlls/msvcr120/msvcr120.spec         |  4 +-
 dlls/msvcr120_app/msvcr120_app.spec |  4 +-
 dlls/msvcrt/cpp.c                   | 81 +++++++++++++++++++++++++++++++++++++
 6 files changed, 91 insertions(+), 10 deletions(-)

diff --git a/dlls/msvcp140/msvcp140.spec b/dlls/msvcp140/msvcp140.spec
index f8a5dfd..8e92019 100644
--- a/dlls/msvcp140/msvcp140.spec
+++ b/dlls/msvcp140/msvcp140.spec
@@ -1695,8 +1695,8 @@
 @ stub -arch=win64 ?__ExceptionPtrCompare@@YA_NPEBX0 at Z
 @ cdecl -arch=win32 ?__ExceptionPtrCopy@@YAXPAXPBX at Z(ptr ptr) msvcr120.?__ExceptionPtrCopy@@YAXPAXPBX at Z
 @ cdecl -arch=win64 ?__ExceptionPtrCopy@@YAXPEAXPEBX at Z(ptr ptr) msvcr120.?__ExceptionPtrCopy@@YAXPEAXPEBX at Z
-@ stub -arch=win32 ?__ExceptionPtrCopyException@@YAXPAXPBX1 at Z
-@ stub -arch=win64 ?__ExceptionPtrCopyException@@YAXPEAXPEBX1 at Z
+@ cdecl -arch=win32 ?__ExceptionPtrCopyException@@YAXPAXPBX1 at Z(ptr ptr ptr) msvcr120.?__ExceptionPtrCopyException@@YAXPAXPBX1 at Z
+@ cdecl -arch=win64 ?__ExceptionPtrCopyException@@YAXPEAXPEBX1 at Z(ptr ptr ptr) msvcr120.?__ExceptionPtrCopyException@@YAXPEAXPEBX1 at Z
 @ cdecl -arch=win32 ?__ExceptionPtrCreate@@YAXPAX at Z(ptr) msvcr120.?__ExceptionPtrCreate@@YAXPAX at Z
 @ cdecl -arch=win64 ?__ExceptionPtrCreate@@YAXPEAX at Z(ptr) msvcr120.?__ExceptionPtrCreate@@YAXPEAX at Z
 @ cdecl -arch=win32 ?__ExceptionPtrCurrentException@@YAXPAX at Z(ptr) msvcr120.?__ExceptionPtrCurrentException@@YAXPAX at Z
diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec
index b070bed..62815b6 100644
--- a/dlls/msvcr100/msvcr100.spec
+++ b/dlls/msvcr100/msvcr100.spec
@@ -414,8 +414,8 @@
 @ stub -arch=win64 ?__ExceptionPtrCompare@@YA_NPEBX0 at Z
 @ cdecl -arch=win32 ?__ExceptionPtrCopy@@YAXPAXPBX at Z(ptr ptr) __ExceptionPtrCopy
 @ cdecl -arch=win64 ?__ExceptionPtrCopy@@YAXPEAXPEBX at Z(ptr ptr) __ExceptionPtrCopy
-@ stub -arch=win32 ?__ExceptionPtrCopyException@@YAXPAXPBX1 at Z
-@ stub -arch=win64 ?__ExceptionPtrCopyException@@YAXPEAXPEBX1 at Z
+@ cdecl -arch=win32 ?__ExceptionPtrCopyException@@YAXPAXPBX1 at Z(ptr ptr ptr) __ExceptionPtrCopyException
+@ cdecl -arch=win64 ?__ExceptionPtrCopyException@@YAXPEAXPEBX1 at Z(ptr ptr ptr) __ExceptionPtrCopyException
 @ cdecl -arch=win32 ?__ExceptionPtrCreate@@YAXPAX at Z(ptr) __ExceptionPtrCreate
 @ cdecl -arch=win64 ?__ExceptionPtrCreate@@YAXPEAX at Z(ptr) __ExceptionPtrCreate
 @ cdecl -arch=win32 ?__ExceptionPtrCurrentException@@YAXPAX at Z(ptr) __ExceptionPtrCurrentException
diff --git a/dlls/msvcr110/msvcr110.spec b/dlls/msvcr110/msvcr110.spec
index c5cebca..9d0c993 100644
--- a/dlls/msvcr110/msvcr110.spec
+++ b/dlls/msvcr110/msvcr110.spec
@@ -692,8 +692,8 @@
 @ stub -arch=win64 ?__ExceptionPtrCompare@@YA_NPEBX0 at Z
 @ cdecl -arch=win32 ?__ExceptionPtrCopy@@YAXPAXPBX at Z(ptr ptr) __ExceptionPtrCopy
 @ cdecl -arch=win64 ?__ExceptionPtrCopy@@YAXPEAXPEBX at Z(ptr ptr) __ExceptionPtrCopy
-@ stub -arch=win32 ?__ExceptionPtrCopyException@@YAXPAXPBX1 at Z
-@ stub -arch=win64 ?__ExceptionPtrCopyException@@YAXPEAXPEBX1 at Z
+@ cdecl -arch=win32 ?__ExceptionPtrCopyException@@YAXPAXPBX1 at Z(ptr ptr ptr) __ExceptionPtrCopyException
+@ cdecl -arch=win64 ?__ExceptionPtrCopyException@@YAXPEAXPEBX1 at Z(ptr ptr ptr) __ExceptionPtrCopyException
 @ cdecl -arch=win32 ?__ExceptionPtrCreate@@YAXPAX at Z(ptr) __ExceptionPtrCreate
 @ cdecl -arch=win64 ?__ExceptionPtrCreate@@YAXPEAX at Z(ptr) __ExceptionPtrCreate
 @ cdecl -arch=win32 ?__ExceptionPtrCurrentException@@YAXPAX at Z(ptr) __ExceptionPtrCurrentException
diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec
index d866068..4b59e44 100644
--- a/dlls/msvcr120/msvcr120.spec
+++ b/dlls/msvcr120/msvcr120.spec
@@ -674,8 +674,8 @@
 @ stub -arch=win64 ?__ExceptionPtrCompare@@YA_NPEBX0 at Z
 @ cdecl -arch=win32 ?__ExceptionPtrCopy@@YAXPAXPBX at Z(ptr ptr) __ExceptionPtrCopy
 @ cdecl -arch=win64 ?__ExceptionPtrCopy@@YAXPEAXPEBX at Z(ptr ptr) __ExceptionPtrCopy
-@ stub -arch=win32 ?__ExceptionPtrCopyException@@YAXPAXPBX1 at Z
-@ stub -arch=win64 ?__ExceptionPtrCopyException@@YAXPEAXPEBX1 at Z
+@ cdecl -arch=win32 ?__ExceptionPtrCopyException@@YAXPAXPBX1 at Z(ptr ptr ptr) __ExceptionPtrCopyException
+@ cdecl -arch=win64 ?__ExceptionPtrCopyException@@YAXPEAXPEBX1 at Z(ptr ptr ptr) __ExceptionPtrCopyException
 @ cdecl -arch=win32 ?__ExceptionPtrCreate@@YAXPAX at Z(ptr) __ExceptionPtrCreate
 @ cdecl -arch=win64 ?__ExceptionPtrCreate@@YAXPEAX at Z(ptr) __ExceptionPtrCreate
 @ cdecl -arch=win32 ?__ExceptionPtrCurrentException@@YAXPAX at Z(ptr) __ExceptionPtrCurrentException
diff --git a/dlls/msvcr120_app/msvcr120_app.spec b/dlls/msvcr120_app/msvcr120_app.spec
index 874a66d..4c6a373 100644
--- a/dlls/msvcr120_app/msvcr120_app.spec
+++ b/dlls/msvcr120_app/msvcr120_app.spec
@@ -670,8 +670,8 @@
 @ stub -arch=win64 ?__ExceptionPtrCompare@@YA_NPEBX0 at Z
 @ cdecl -arch=win32 ?__ExceptionPtrCopy@@YAXPAXPBX at Z(ptr ptr) msvcr120.?__ExceptionPtrCopy@@YAXPAXPBX at Z
 @ cdecl -arch=win64 ?__ExceptionPtrCopy@@YAXPEAXPEBX at Z(ptr ptr) msvcr120.?__ExceptionPtrCopy@@YAXPEAXPEBX at Z
-@ stub -arch=win32 ?__ExceptionPtrCopyException@@YAXPAXPBX1 at Z
-@ stub -arch=win64 ?__ExceptionPtrCopyException@@YAXPEAXPEBX1 at Z
+@ cdecl -arch=win32 ?__ExceptionPtrCopyException@@YAXPAXPBX1 at Z(ptr ptr ptr) msvcr120.?__ExceptionPtrCopyException@@YAXPAXPBX1 at Z
+@ cdecl -arch=win64 ?__ExceptionPtrCopyException@@YAXPEAXPEBX1 at Z(ptr ptr ptr) msvcr120.?__ExceptionPtrCopyException@@YAXPEAXPEBX1 at Z
 @ cdecl -arch=win32 ?__ExceptionPtrCreate@@YAXPAX at Z(ptr) msvcr120.?__ExceptionPtrCreate@@YAXPAX at Z
 @ cdecl -arch=win64 ?__ExceptionPtrCreate@@YAXPEAX at Z(ptr) msvcr120.?__ExceptionPtrCreate@@YAXPEAX at Z
 @ cdecl -arch=win32 ?__ExceptionPtrCurrentException@@YAXPAX at Z(ptr) msvcr120.?__ExceptionPtrCurrentException@@YAXPAX at Z
diff --git a/dlls/msvcrt/cpp.c b/dlls/msvcrt/cpp.c
index f7127a3..daf7aee 100644
--- a/dlls/msvcrt/cpp.c
+++ b/dlls/msvcrt/cpp.c
@@ -1499,6 +1499,87 @@ MSVCRT_bool __cdecl __ExceptionPtrToBool(exception_ptr *ep)
     return !!ep->rec;
 }
 
+/*********************************************************************
+ * ?__ExceptionPtrCopyException@@YAXPAXPBX1 at Z
+ * ?__ExceptionPtrCopyException@@YAXPEAXPEBX1 at Z
+ */
+#ifndef __x86_64__
+void __cdecl __ExceptionPtrCopyException(exception_ptr *ep,
+        exception *object, const cxx_exception_type *type)
+{
+    const cxx_type_info *ti;
+    void **data;
+
+    __ExceptionPtrDestroy(ep);
+
+    ep->rec = HeapAlloc(GetProcessHeap(), 0, sizeof(EXCEPTION_RECORD));
+    ep->ref = HeapAlloc(GetProcessHeap(), 0, sizeof(int));
+    *ep->ref = 1;
+
+    memset(ep->rec, 0, sizeof(EXCEPTION_RECORD));
+    ep->rec->ExceptionCode = CXX_EXCEPTION;
+    ep->rec->ExceptionFlags = EH_NONCONTINUABLE;
+    ep->rec->NumberParameters = 3;
+    ep->rec->ExceptionInformation[0] = CXX_FRAME_MAGIC_VC6;
+    ep->rec->ExceptionInformation[2] = (ULONG_PTR)type;
+
+    ti = type->type_info_table->info[0];
+    data = HeapAlloc(GetProcessHeap(), 0, ti->size);
+    if (ti->flags & CLASS_IS_SIMPLE_TYPE)
+    {
+        memcpy(data, object, ti->size);
+        if (ti->size == sizeof(void *)) *data = get_this_pointer(&ti->offsets, *data);
+    }
+    else if (ti->copy_ctor)
+    {
+        call_copy_ctor(ti->copy_ctor, data, get_this_pointer(&ti->offsets, object),
+                ti->flags & CLASS_HAS_VIRTUAL_BASE_CLASS);
+    }
+    else
+        memcpy(data, get_this_pointer(&ti->offsets, object), ti->size);
+    ep->rec->ExceptionInformation[1] = (ULONG_PTR)data;
+}
+#else
+void __cdecl __ExceptionPtrCopyException(exception_ptr *ep,
+        exception *object, const cxx_exception_type *type)
+{
+    const cxx_type_info *ti;
+    void **data;
+    char *base;
+
+    RtlPcToFileHeader((void*)type, (void**)&base);
+    __ExceptionPtrDestroy(ep);
+
+    ep->rec = HeapAlloc(GetProcessHeap(), 0, sizeof(EXCEPTION_RECORD));
+    ep->ref = HeapAlloc(GetProcessHeap(), 0, sizeof(int));
+    *ep->ref = 1;
+
+    memset(ep->rec, 0, sizeof(EXCEPTION_RECORD));
+    ep->rec->ExceptionCode = CXX_EXCEPTION;
+    ep->rec->ExceptionFlags = EH_NONCONTINUABLE;
+    ep->rec->NumberParameters = 4;
+    ep->rec->ExceptionInformation[0] = CXX_FRAME_MAGIC_VC6;
+    ep->rec->ExceptionInformation[2] = (ULONG_PTR)type;
+    ep->rec->ExceptionInformation[3] = (ULONG_PTR)base;
+
+    ti = (const cxx_type_info*)(base + ((const cxx_type_info_table*)(base + type->type_info_table))->info[0]);
+    data = HeapAlloc(GetProcessHeap(), 0, ti->size);
+    if (ti->flags & CLASS_IS_SIMPLE_TYPE)
+    {
+        memcpy(data, object, ti->size);
+        if (ti->size == sizeof(void *)) *data = get_this_pointer(&ti->offsets, *data);
+    }
+    else if (ti->copy_ctor)
+    {
+        call_copy_ctor(base + ti->copy_ctor, data, get_this_pointer(&ti->offsets, object),
+                ti->flags & CLASS_HAS_VIRTUAL_BASE_CLASS);
+    }
+    else
+        memcpy(data, get_this_pointer(&ti->offsets, object), ti->size);
+    ep->rec->ExceptionInformation[1] = (ULONG_PTR)data;
+}
+#endif
+
 void* __cdecl __AdjustPointer(void *obj, const this_ptr_offsets *off)
 {
     return get_this_pointer(off, obj);




More information about the wine-cvs mailing list