cpython: b701eb69260d (original) (raw)

Mercurial > cpython

changeset 93408:b701eb69260d

Issue #20160: broken ctypes calling convention on MSVC / 64-bit Windows (large structs) Patch by mattip [#20160]

Steve Dower steve.dower@microsoft.com
date Wed, 05 Nov 2014 19:30:30 -0800
parents 089573725c77(current diff)cd36ba22602d(diff)
children 9ed44777331d
files Modules/_ctypes/callproc.c
diffstat 6 files changed, 104 insertions(+), 15 deletions(-)[+] [-] Lib/ctypes/test/test_win32.py 26 Modules/_ctypes/_ctypes_test.c 43 Modules/_ctypes/callproc.c 3 Modules/_ctypes/libffi_msvc/ffi.c 29 Modules/_ctypes/libffi_msvc/prep_cif.c 16 Modules/_ctypes/libffi_msvc/types.c 2

line wrap: on

line diff

--- a/Lib/ctypes/test/test_win32.py +++ b/Lib/ctypes/test/test_win32.py @@ -111,9 +111,29 @@ class Structures(unittest.TestCase): dll = CDLL(_ctypes_test.file)

+

if name == 'main': unittest.main()

--- a/Modules/_ctypes/_ctypes_test.c +++ b/Modules/_ctypes/_ctypes_test.c @@ -527,6 +527,49 @@ EXPORT(int) PointInRect(RECT prc, POINT return 1; } +EXPORT(int left = 10); +EXPORT(int top = 20); +EXPORT(int right = 30); +EXPORT(int bottom = 40); + +EXPORT(RECT) ReturnRect(int i, RECT ar, RECT br, POINT cp, RECT dr,

+{

+

+} + typedef struct { short x; short y;

--- a/Modules/_ctypes/callproc.c +++ b/Modules/_ctypes/callproc.c @@ -1140,9 +1140,6 @@ PyObject *_ctypes_callproc(PPROC pProc, for (i = 0; i < argcount; ++i) { atypes[i] = args[i].ffi_type; if (atypes[i]->type == FFI_TYPE_STRUCT -#ifdef _WIN64

-#endif ) avalues[i] = (void *)args[i].value.p; else

--- a/Modules/_ctypes/libffi_msvc/ffi.c +++ b/Modules/_ctypes/libffi_msvc/ffi.c @@ -102,6 +102,15 @@ void ffi_prep_args(char *stack, extended FFI_ASSERT(0); } } +#ifdef _WIN64

+#endif else { memcpy(argp, *p_argv, z); @@ -124,7 +133,6 @@ ffi_status ffi_prep_cif_machdep(ffi_cif switch (cif->rtype->type) { case FFI_TYPE_VOID:

+ case FFI_TYPE_UINT64: #ifdef _WIN64 case FFI_TYPE_POINTER: @@ -201,8 +221,7 @@ ffi_call(/@dependent@/ ffi_cif cif, #else case FFI_SYSV: /@-usedef@*/

@@ -227,7 +246,7 @@ void * #else static void __fastcall #endif -ffi_closure_SYSV (ffi_closure *closure, int *argp) +ffi_closure_SYSV (ffi_closure *closure, char *argp) { // this is our return value storage long double res; @@ -237,7 +256,7 @@ ffi_closure_SYSV (ffi_closure *closure, void **arg_area; unsigned short rtype; void resp = (void)&res;

--- a/Modules/_ctypes/libffi_msvc/prep_cif.c +++ b/Modules/_ctypes/libffi_msvc/prep_cif.c @@ -116,9 +116,9 @@ ffi_status ffi_prep_cif(/@out@/ /@par #if !defined M68K && !defined x86_64 && !defined S390 / Make space for the return structure pointer */ if (cif->rtype->type == FFI_TYPE_STRUCT

+#ifdef _WIN32

+#endif #ifdef SPARC && (cif->abi != FFI_V9 || cif->rtype->size > 32) #endif @@ -145,6 +145,10 @@ ffi_status ffi_prep_cif(/@out@/ /@par && cif->abi != FFI_V9)) bytes += sizeof(void); else +#elif defined (_WIN64)

#endif { #if !defined(_MSC_VER) && !defined(MINGW32) @@ -168,6 +172,12 @@ ffi_status ffi_prep_cif(/@out@/ /*@par #endif } +#ifdef _WIN64

+#endif + cif->bytes = bytes; /* Perform machine dependent cif processing */

--- a/Modules/_ctypes/libffi_msvc/types.c +++ b/Modules/_ctypes/libffi_msvc/types.c @@ -43,7 +43,7 @@ FFI_INTEGRAL_TYPEDEF(sint32, 4, 4, FFI_T FFI_INTEGRAL_TYPEDEF(float, 4, 4, FFI_TYPE_FLOAT); #if defined ALPHA || defined SPARC64 || defined X86_64 || defined S390X [](#l6.6)

FFI_INTEGRAL_TYPEDEF(pointer, 8, 8, FFI_TYPE_POINTER);