diff options
author | Antoine Pitrou <solipsis@pitrou.net> | 2014-08-29 22:37:18 (GMT) |
---|---|---|
committer | Antoine Pitrou <solipsis@pitrou.net> | 2014-08-29 22:37:18 (GMT) |
commit | 5ce8f35931402661fa39c0f2dab44354f2a1d677 (patch) | |
tree | 1ebf3758fdc4d58ee5f4e91a0bcfe58516062a4a | |
parent | fa9211b11dd9b78afbb3dda617267c150ba04cf0 (diff) | |
download | cpython-5ce8f35931402661fa39c0f2dab44354f2a1d677.zip cpython-5ce8f35931402661fa39c0f2dab44354f2a1d677.tar.gz cpython-5ce8f35931402661fa39c0f2dab44354f2a1d677.tar.bz2 |
Issue #22098: ctypes' BigEndianStructure and LittleEndianStructure now define an empty __slots__ so that subclasses don't always get an instance dict.
Patch by Claudiu Popa.
-rw-r--r-- | Lib/ctypes/_endian.py | 2 | ||||
-rw-r--r-- | Lib/ctypes/test/test_byteswap.py | 20 | ||||
-rw-r--r-- | Misc/NEWS | 4 |
3 files changed, 26 insertions, 0 deletions
diff --git a/Lib/ctypes/_endian.py b/Lib/ctypes/_endian.py index dae65fc..37444bd 100644 --- a/Lib/ctypes/_endian.py +++ b/Lib/ctypes/_endian.py @@ -45,6 +45,7 @@ if sys.byteorder == "little": class BigEndianStructure(Structure, metaclass=_swapped_meta): """Structure with big endian byte order""" + __slots__ = () _swappedbytes_ = None elif sys.byteorder == "big": @@ -53,6 +54,7 @@ elif sys.byteorder == "big": BigEndianStructure = Structure class LittleEndianStructure(Structure, metaclass=_swapped_meta): """Structure with little endian byte order""" + __slots__ = () _swappedbytes_ = None else: diff --git a/Lib/ctypes/test/test_byteswap.py b/Lib/ctypes/test/test_byteswap.py index 427bb8b..01c97e8 100644 --- a/Lib/ctypes/test/test_byteswap.py +++ b/Lib/ctypes/test/test_byteswap.py @@ -22,6 +22,26 @@ class Test(unittest.TestCase): setattr(bits, "i%s" % i, 1) dump(bits) + def test_slots(self): + class BigPoint(BigEndianStructure): + __slots__ = () + _fields_ = [("x", c_int), ("y", c_int)] + + class LowPoint(LittleEndianStructure): + __slots__ = () + _fields_ = [("x", c_int), ("y", c_int)] + + big = BigPoint() + little = LowPoint() + big.x = 4 + big.y = 2 + little.x = 2 + little.y = 4 + with self.assertRaises(AttributeError): + big.z = 42 + with self.assertRaises(AttributeError): + little.z = 24 + def test_endian_short(self): if sys.byteorder == "little": self.assertIs(c_short.__ctype_le__, c_short) @@ -124,6 +124,10 @@ Core and Builtins Library ------- +- Issue #22098: ctypes' BigEndianStructure and LittleEndianStructure now + define an empty __slots__ so that subclasses don't always get an instance + dict. Patch by Claudiu Popa. + - Issue #22185: Fix an occasional RuntimeError in threading.Condition.wait() caused by mutation of the waiters queue without holding the lock. Patch by Doug Zongker. |