[Python-Dev] ctypes: Configurable bitfield allocation strategy

Terry Reedy tjreedy at udel.edu
Sat Jun 25 21:09:24 CEST 2011


On 6/25/2011 12:33 PM, Vlad Riscutia wrote:
> I recently started looking at some ctypes issues. I dug a bit into
> http://bugs.python.org/issue6069 and then I found
> http://bugs.python.org/issue11920. They both boil down to the fact that
> bitfield allocation is up to the compiler, which is different in GCC and
> MSVC. Currently we have hard-coded allocation strategy based on paltform
> in cfields.c:
>>> if (bitsize /* this is a bitfield request */
>>> && *pfield_size /* we have a bitfield open */
>> #ifdef MS_WIN32
>> /* MSVC, GCC with -mms-bitfields */
>> && dict->size * 8 == *pfield_size
>> #else
>> /* GCC */
>> && dict->size * 8<= *pfield_size
>> #endif
>> && (*pbitofs + bitsize)<= *pfield_size) {
>> /* continue bit field */
>> fieldtype = CONT_BITFIELD;
>> #ifndef MS_WIN32
>> } else if (bitsize /* this is a bitfield request */
>> && *pfield_size /* we have a bitfield open */
>> && dict->size * 8>= *pfield_size
>> && (*pbitofs + bitsize)<= dict->size * 8) {
>> /* expand bit field */
>> fieldtype = EXPAND_BITFIELD;
>> #endif
>> So when creating a bitfield structure, it's size can be different on
> Linux vs Windows.
>> class MyStructure(ctypes.BigEndianStructure):
> _pack_ = 1 # aligned to 8 bits, not ctypes default of 32
> _fields_ = [
> ("Data0", ctypes.c_uint32, 32),
> ("Data1", ctypes.c_uint8, 3),
> ("Data2", ctypes.c_uint16, 12),
> ]
>> sizeof for above structure is 6 on GCC build and 7 on MSVC build. This
> leads to some confusion and issues, because we can't always interop
> correctly with code compiled with different compiler than the one Python
> is compiled with on the platform.

Just curious, are you saying that this is the 'cause' of the two bug 
reports, or 'just' something you discovered while investigating them?
 > Short term solution is to add a warning in the documentation about this.
For 2.7/3.2, yes.
 > Longer term though, I think it
> would be better to add a property on the Structure class for
> configurable allocation strategy, for example Native (default), GCC,
> MSVC and when allocating the bitfield, use given strategy. Native would
> behave similar to what happens now, but we would also allow GCC-style
> allocation on Windows for example and the ability to extend this if we
> ever run into similar issues with other compilers. This shouldn't be too
> difficult to implement, will be backwards compatible and it would
> improve interop. I would like to hear some opinions on this.

If this would allow the MSVC-compilied Python to better access dlls 
compiled with gcc (cygwin) on Windows, definitely -- in 3.3.
If the new feature is (currently) only useful on Windows, doc should say so.
-- 
Terry Jan Reedy


More information about the Python-Dev mailing list

AltStyle によって変換されたページ (->オリジナル) /