Skip to content

TypeError when using ctypes.BigEndianUnion nested in ctypes.BigEndianStructure on a little endian system (or vice versa) #105102

Closed
@Sh3idan

Description

@Sh3idan

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    3.11only security fixes3.12only security fixes3.13bugs and security fixesstdlibPython modules in the Lib dirtopic-ctypestype-bugAn unexpected behavior, bug, or error

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions