# 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)
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()