Skip to content

Commit 197e26d

Browse files
committed
Test weakref proxy ref leaks
1 parent ddad602 commit 197e26d

1 file changed

Lines changed: 36 additions & 0 deletions

File tree

Lib/test/test_weakref.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,42 @@ def check(proxy):
235235
self.assertRaises(ReferenceError, bool, ref3)
236236
self.assertEqual(self.cbcalled, 2)
237237

238+
@support.refcount_test
239+
def test_proxy_dead_arg_refcount(self):
240+
class C:
241+
def __add__(self, other):
242+
return NotImplemented
243+
def __radd__(self, other):
244+
return NotImplemented
245+
def __getitem__(self, item):
246+
return None
247+
def __eq__(self, other):
248+
return NotImplemented
249+
def __pow__(self, other, modulo=None):
250+
return NotImplemented
251+
252+
dead_obj = C()
253+
dead = weakref.proxy(dead_obj)
254+
del dead_obj
255+
gc_collect()
256+
257+
cases = [
258+
lambda live: live + dead,
259+
lambda live: live[dead],
260+
lambda live: live == dead,
261+
lambda live: pow(live, dead),
262+
lambda live: pow(live, 2, dead),
263+
]
264+
for case in cases:
265+
with self.subTest(case=case):
266+
live_obj = C()
267+
live = weakref.proxy(live_obj)
268+
refcount = sys.getrefcount(live_obj)
269+
for _ in range(100):
270+
with self.assertRaises(ReferenceError):
271+
case(live)
272+
self.assertEqual(sys.getrefcount(live_obj), refcount)
273+
238274
@support.cpython_only
239275
def test_proxy_repr(self):
240276
obj = C()

0 commit comments

Comments
 (0)