diff options
author | Vinay Sajip <vinay_sajip@yahoo.co.uk> | 2019-09-25 21:41:02 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-09-25 21:41:02 (GMT) |
commit | b92b8c53f63d2e805288ac2c665bf5887d1b7ca6 (patch) | |
tree | 7a738731f7894487d9f469497c7c4055044e78a3 /Modules | |
parent | 4267e8f72a7d8fe0433819511a5ae45d45e1c67b (diff) | |
download | cpython-b92b8c53f63d2e805288ac2c665bf5887d1b7ca6.zip cpython-b92b8c53f63d2e805288ac2c665bf5887d1b7ca6.tar.gz cpython-b92b8c53f63d2e805288ac2c665bf5887d1b7ca6.tar.bz2 |
[3.8] bpo-22273: Changed conditions for ctypes array-in-struct handling. (GH-16381) (GH-16401)
(cherry picked from commit c64af8fad3c4f5751af624647fbb0ce023f525dc)
Diffstat (limited to 'Modules')
-rw-r--r-- | Modules/_ctypes/stgdict.c | 11 |
1 files changed, 4 insertions, 7 deletions
diff --git a/Modules/_ctypes/stgdict.c b/Modules/_ctypes/stgdict.c index 62dcece..a27d134 100644 --- a/Modules/_ctypes/stgdict.c +++ b/Modules/_ctypes/stgdict.c @@ -350,9 +350,7 @@ PyCStructUnionType_update_stgdict(PyObject *type, PyObject *fields, int isStruct int pack; Py_ssize_t ffi_ofs; int big_endian; -#if defined(X86_64) int arrays_seen = 0; -#endif /* HACK Alert: I cannot be bothered to fix ctypes.com, so there has to be a way to use the old, broken semantics: _fields_ are not extended @@ -504,10 +502,8 @@ PyCStructUnionType_update_stgdict(PyObject *type, PyObject *fields, int isStruct Py_XDECREF(pair); return -1; } -#if defined(X86_64) if (PyCArrayTypeObject_Check(desc)) arrays_seen = 1; -#endif dict = PyType_stgdict(desc); if (dict == NULL) { Py_DECREF(pair); @@ -648,8 +644,6 @@ PyCStructUnionType_update_stgdict(PyObject *type, PyObject *fields, int isStruct stgdict->align = total_align; stgdict->length = len; /* ADD ffi_ofs? */ -#if defined(X86_64) - #define MAX_ELEMENTS 16 if (arrays_seen && (size <= 16)) { @@ -669,6 +663,10 @@ PyCStructUnionType_update_stgdict(PyObject *type, PyObject *fields, int isStruct * accurate set, to allow libffi to marshal them into registers * correctly. It means one more loop over the fields, but if we got * here, the structure is small, so there aren't too many of those. + * + * Although the passing in registers is specific to 64-bit Linux, the + * array-in-struct vs. pointer problem is general. But we restrict the + * type transformation to small structs nonetheless. */ ffi_type *actual_types[MAX_ELEMENTS + 1]; int actual_type_index = 0; @@ -746,7 +744,6 @@ PyCStructUnionType_update_stgdict(PyObject *type, PyObject *fields, int isStruct memcpy(&stgdict->ffi_type_pointer.elements[ffi_ofs], actual_types, actual_type_index * sizeof(ffi_type *)); } -#endif /* We did check that this flag was NOT set above, it must not have been set until now. */ |