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

(cherry picked from commit 0b541f64c4)

Co-authored-by: Sheidan <37596668+Sh3idan@users.noreply.github.com>
This commit is contained in:
Serhiy Storchaka 2024-01-17 21:58:28 +02:00 committed by GitHub
parent 5dcb15da88
commit 2b03259022
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 23 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

@ -352,5 +352,24 @@ class TestUnion(parent):
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.