|
| 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)
|
@@ -279,6 +281,32 @@ def test_deprecation(self):
|
279 | 281 | with self.assertWarns(DeprecationWarning):
|
280 | 282 | CharArray = ctypes.ARRAY(c_char, 3)
|
281 | 283 |
|
| 284 | + def test_ptr_reuse(self): |
| 285 | + w = weakref.WeakValueDictionary() |
| 286 | + arr = 3 * POINTER(c_short) |
| 287 | + |
| 288 | + vals = arr( |
| 289 | + pointer(w.setdefault(10, c_short(10))), |
| 290 | + pointer(w.setdefault(11, c_short(11))), |
| 291 | + None, |
| 292 | + ) |
| 293 | + gc.collect() |
| 294 | + |
| 295 | + self.assertEqual(vals[0].contents.value, 10) |
| 296 | + self.assertEqual(vals[1].contents.value, 11) |
| 297 | + |
| 298 | + vals[2] = vals[0] |
| 299 | + |
| 300 | + self.assertEqual(vals[2].contents.value, 10) |
| 301 | + |
| 302 | + vals[2][0] = w.setdefault(12, c_short(12)) |
| 303 | + vals[2].contents = w.setdefault(13, c_short(13)) |
| 304 | + |
| 305 | + gc.collect() |
| 306 | + |
| 307 | + self.assertEqual(vals[2].contents.value, 13) |
| 308 | + self.assertEqual(vals[0].contents.value, 12) |
| 309 | + |
282 | 310 |
|
283 | 311 | if __name__ == '__main__':
|
284 | 312 | unittest.main()
|
0 commit comments