Closed
Description
Bug report
The classes ctypes.BigEndianUnion and ctypes.LittleEndianUnion was added in Python 3.11. In the case of the use of an Union
in a Structure
class that match the opposite system endianness, the Union
class can't be used as shown below:
# coding: utf-8
import sys
import ctypes as c
assert sys.byteorder == "little"
"""
struct MyStruct {
unsigned char a;
unsigned char b:
};
struct MainStruct {
union {
struct MyStruct my_struct;
short field_ab;
} my_union;
unsigned char foo;
};
"""
class MyStruct(c.BigEndianStructure):
_fields_ = [("a", c.c_byte), ("b", c.c_byte)]
class MyUnion(c.BigEndianUnion):
_fields_ = [("my_struct", MyStruct), ("ab", c.c_short)]
class MainStruct(c.BigEndianStructure):
_fields_ = [("my_union", MyUnion), ("foo", c.c_byte)]
The following traceback is given by the interpretor:
TypeError Traceback (most recent call last)
Cell In[1], line 28
24 class MyUnion(c.BigEndianUnion):
25 _fields_ = [("my_struct", MyStruct), ("ab", c.c_short)]
---> 28 class MainStruct(c.BigEndianStructure):
29 _fields_ = [("my_union", MyUnion), ("foo", c.c_byte)]
File ~\AppData\Local\Programs\Python\Python311\Lib\ctypes\_endian.py:31, in _swapped_meta.__setattr__(self, attrname, value)
29 typ = desc[1]
30 rest = desc[2:]
---> 31 fields.append((name, _other_endian(typ)) + rest)
32 value = fields
33 super().__setattr__(attrname, value)
File ~\AppData\Local\Programs\Python\Python311\Lib\ctypes\_endian.py:21, in _other_endian(typ)
19 if issubclass(typ, Structure):
20 return typ
---> 21 raise TypeError("This type does not support other endian: %s" % typ)
TypeError: This type does not support other endian: <class '__main__.MyUnion'>
Your environment
- CPython versions tested on: Interpreter compiled from the main branch in debug mode and also Python 3.11 (coming from the official release)
- Operating system and architecture: Windows 10 x64
Linked PRs
- gh-105102: fix nested unions in structures when the system byteorder is the opposite #105106
- [3.12] gh-105102: Fix nested unions in structures when the system byteorder is the opposite (GH-105106) #114204
- [3.11] gh-105102: Fix nested unions in structures when the system byteorder is the opposite (GH-105106) #114205