@@ -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