]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-105102: Fix nested unions in structures when the system byteorder is the opposite...
authorSheidan <37596668+Sh3idan@users.noreply.github.com>
Wed, 17 Jan 2024 18:20:39 +0000 (19:20 +0100)
committerGitHub <noreply@github.com>
Wed, 17 Jan 2024 18:20:39 +0000 (18:20 +0000)
Lib/ctypes/_endian.py
Lib/test/test_ctypes/test_byteswap.py
Misc/NEWS.d/next/Library/2023-05-30-18-30-11.gh-issue-105102.SnpK04.rst [new file with mode: 0644]

index 3febb3118b8230762f605d4d4a725954fbc3ca27..6382dd22b8acc83653ac76e481cd9aa5b6a9a70f 100644 (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)
 
index b97b57646ecd711306b91bb172603b834b0edf96..78eff0392c4548b599a6d5614f7fcdbfd57d7b83 100644 (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()
diff --git a/Misc/NEWS.d/next/Library/2023-05-30-18-30-11.gh-issue-105102.SnpK04.rst b/Misc/NEWS.d/next/Library/2023-05-30-18-30-11.gh-issue-105102.SnpK04.rst
new file mode 100644 (file)
index 0000000..7ca21af
--- /dev/null
@@ -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.