Eryk Sun added the comment:

ctypes defines arrays as a pointer FFI type because they degenerate as pointers 
in C calls. But it's generally wrong to set a pointer FFI type for an array in 
the `elements` of a struct's FFI type. An integer array in a struct that's 16 
bytes or less should be packed in one or two general-purpose registers (rdi, 
rsi, rdx, rcx, r8, r9). 

For the example 16-byte struct, classify_argument() in ffi64.c expects to 
classify two 8-byte words. But the struct's FFI type only has one element, 
which we've incorrectly defined as a pointer element. Thus the second word is 
left at the default classification X86_64_NO_CLASS. Back in ffi_call() it 
expects two classified words, so it aborts when it sees X86_64_NO_CLASS.

I think we can special-case small arrays in PyCStructUnionType_update_stgdict 
when assigning the `elements` of the FFI type of a struct or union. If we have 
an array that's 32 bytes or less, unpack it as individual FFI elements, e.g. a 
c_ushort * 8 array would be stored as 8 ffi_type_uint16 elements in the 
struct's FFI type.

----------
nosy: +eryksun

_______________________________________
Python tracker <rep...@bugs.python.org>
<http://bugs.python.org/issue22273>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to