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