|
| 1 | +import gc |
1 | 2 | import ctypes
|
2 | 3 | import sys
|
3 | 4 | import unittest
|
4 | 5 | import warnings
|
5 |
| -from ctypes import (Structure, Array, sizeof, addressof, |
| 6 | +import weakref |
| 7 | +from ctypes import (Structure, Array, sizeof, addressof, POINTER, pointer, |
6 | 8 | create_string_buffer, create_unicode_buffer,
|
7 | 9 | c_char, c_wchar, c_byte, c_ubyte, c_short, c_ushort, c_int, c_uint,
|
8 | 10 | c_long, c_ulonglong, c_float, c_double, c_longdouble)
|
@@ -249,6 +251,32 @@ def test_deprecation(self):
|
249 | 251 | with self.assertWarns(DeprecationWarning):
|
250 | 252 | CharArray = ctypes.ARRAY(c_char, 3)
|
251 | 253 |
|
| 254 | + def test_ptr_reuse(self): |
| 255 | + w = weakref.WeakValueDictionary() |
| 256 | + arr = 3 * POINTER(c_short) |
| 257 | + |
| 258 | + vals = arr( |
| 259 | + pointer(w.setdefault(10, c_short(10))), |
| 260 | + pointer(w.setdefault(11, c_short(11))), |
| 261 | + None, |
| 262 | + ) |
| 263 | + gc.collect() |
| 264 | + |
| 265 | + self.assertEqual(vals[0].contents.value, 10) |
| 266 | + self.assertEqual(vals[1].contents.value, 11) |
| 267 | + |
| 268 | + vals[2] = vals[0] |
| 269 | + |
| 270 | + self.assertEqual(vals[2].contents.value, 10) |
| 271 | + |
| 272 | + vals[2][0] = w.setdefault(12, c_short(12)) |
| 273 | + vals[2].contents = w.setdefault(13, c_short(13)) |
| 274 | + |
| 275 | + gc.collect() |
| 276 | + |
| 277 | + self.assertEqual(vals[2].contents.value, 13) |
| 278 | + self.assertEqual(vals[0].contents.value, 12) |
| 279 | + |
252 | 280 |
|
253 | 281 | if __name__ == '__main__':
|
254 | 282 | unittest.main()
|
0 commit comments