◐ Shell
reader mode source ↗
Skip to content
Merged
Changes from all commits
File filter
Conversations
Jump to
Diff view
Apply and reload
Show whitespace
Diff view
Apply and reload
11 changes: 4 additions & 7 deletions Modules/_ctypes/stgdict.c
Original file line number Diff line number Diff line change
Expand Up @@ -344,9 +344,7 @@ PyCStructUnionType_update_stgdict(PyObject *type, PyObject *fields, int isStruct
int pack = 0;
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 sematics: _fields_ are not extended
Expand Down Expand Up @@ -471,10 +469,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);
Expand Down Expand Up @@ -615,8 +611,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)) {
@@ -636,6 +630,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.
*/
ffi_type *actual_types[MAX_ELEMENTS + 1];
int actual_type_index = 0;
Expand Down Expand Up @@ -713,7 +711,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. */
Expand Down
Toggle all file notes Toggle all file annotations