gh-105102: Fix nested unions in structures when the system byteorder is the opposite (GH-105106)

This commit is contained in:
Sheidan 2024-01-17 19:20:39 +01:00 committed by GitHub
parent 33b47a2c28
commit 0b541f64c4
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 22 additions and 2 deletions

View File

@ -15,8 +15,8 @@ def _other_endian(typ):
# if typ is array
if isinstance(typ, _array_type):
return _other_endian(typ._type_) * typ._length_
# if typ is structure
if issubclass(typ, Structure):
# if typ is structure or union
if issubclass(typ, (Structure, Union)):
return typ
raise TypeError("This type does not support other endian: %s" % typ)

View File

@ -363,6 +363,24 @@ class Test(unittest.TestCase):
self.assertEqual(s.point.x, 1)
self.assertEqual(s.point.y, 2)
def test_build_struct_union_opposite_system_byteorder(self):
# gh-105102
if sys.byteorder == "little":
_Structure = BigEndianStructure
_Union = BigEndianUnion
else:
_Structure = LittleEndianStructure
_Union = LittleEndianUnion
class S1(_Structure):
_fields_ = [("a", c_byte), ("b", c_byte)]
class U1(_Union):
_fields_ = [("s1", S1), ("ab", c_short)]
class S2(_Structure):
_fields_ = [("u1", U1), ("c", c_byte)]
if __name__ == "__main__":
unittest.main()

View File

@ -0,0 +1,2 @@
Allow :class:`ctypes.Union` to be nested in :class:`ctypes.Structure` when
the system endianness is the opposite of the classes.