Piotr Caban : msvcp110: Fix 64-bit _Getcoll implementation.

Alexandre Julliard julliard at wine.codeweavers.com
Fri Oct 30 08:22:26 CDT 2015


Module: wine
Branch: master
Commit: ef9a3be8b00b5dd4385408e9c546982b089d3ccf
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=ef9a3be8b00b5dd4385408e9c546982b089d3ccf

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Fri Oct 30 13:17:47 2015 +0100

msvcp110: Fix 64-bit _Getcoll implementation.

Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/msvcp90/locale.c | 39 +++++++++++++++++++++++++--------------
 1 file changed, 25 insertions(+), 14 deletions(-)

diff --git a/dlls/msvcp90/locale.c b/dlls/msvcp90/locale.c
index 5bd10eb..f3ad140 100644
--- a/dlls/msvcp90/locale.c
+++ b/dlls/msvcp90/locale.c
@@ -20,6 +20,7 @@
 
 #include <stdarg.h>
 
+#include "assert.h"
 #include "locale.h"
 #include "errno.h"
 #include "limits.h"
@@ -649,33 +650,43 @@ _Locinfo* __thiscall _Locinfo__Addcats(_Locinfo *this, int category, const char
     return _Locinfo__Locinfo_Addcats(this, category, locstr);
 }
 
-/* _Getcoll */
-ULONGLONG __cdecl _Getcoll(void)
+static _Collvec* getcoll(_Collvec *ret)
 {
-    union {
-        _Collvec collvec;
-        ULONGLONG ull;
-    } ret;
-
     TRACE("\n");
 
-    ret.collvec.page = ___lc_collate_cp_func();
+    ret->page = ___lc_collate_cp_func();
 #if _MSVCP_VER < 110
-    ret.collvec.handle = ___lc_handle_func()[LC_COLLATE];
+    ret->handle = ___lc_handle_func()[LC_COLLATE];
 #else
-    ret.collvec.lc_name = ___lc_locale_name_func()[LC_COLLATE];
+    ret->lc_name = ___lc_locale_name_func()[LC_COLLATE];
 #endif
-    return ret.ull;
+    return ret;
 }
 
+/* _Getcoll */
+#if defined(__i386__) || _MSVCP_VER<110
+ULONGLONG __cdecl _Getcoll(void)
+{
+    ULONGLONG ret;
+
+    C_ASSERT(sizeof(_Collvec) <= sizeof(ULONGLONG));
+
+    getcoll((_Collvec*)&ret);
+    return ret;
+}
+#else
+_Collvec* __cdecl _Getcoll(_Collvec *ret)
+{
+    return getcoll(ret);
+}
+#endif
+
 /* ?_Getcoll at _Locinfo@std@@QBE?AU_Collvec@@XZ */
 /* ?_Getcoll at _Locinfo@std@@QEBA?AU_Collvec@@XZ */
 DEFINE_THISCALL_WRAPPER(_Locinfo__Getcoll, 8)
 _Collvec* __thiscall _Locinfo__Getcoll(const _Locinfo *this, _Collvec *ret)
 {
-    ULONGLONG ull = _Getcoll();
-    memcpy(ret, &ull, sizeof(ull));
-    return ret;
+    return getcoll(ret);
 }
 
 /* _Getctype */




More information about the wine-cvs mailing list