@@ -538,83 +538,44 @@ class MyObj:
538538 with self .assertRaises (TypeError ):
539539 hash (weakref .proxy (obj ))
540540
541- def test_proxy_unref_add_refcount (self ):
542- class C :
543- def __add__ (self , o ):
544- return NotImplemented
545-
546- # create dead proxy
547- o = C ()
541+ def _assert_no_proxy_refcount_leak (self , make_class , do_op , op_name ):
542+ """Helper: verify a proxy operation doesn't leak."""
543+ # Create dead proxy
544+ o = make_class ()
548545 dead = weakref .proxy (o )
549546 del o
550547 gc .collect ()
551-
552- # create live proxy
553- obj = C ()
548+
549+ # Create live proxy
550+ obj = make_class ()
554551 ref = weakref .ref (obj )
555552 proxy = weakref .proxy (obj )
556-
553+
554+ # run operation
557555 try :
558- operator . add (proxy , dead )
556+ do_op (proxy , dead )
559557 except ReferenceError :
560558 pass
561-
562559 del proxy , obj , dead
563560 gc .collect ()
564-
565- self .assertIsNone (ref (), "Leaked object in add operation" )
566-
567- def test_proxy_unref_pow_refcount (self ):
561+
562+ # verify
563+ self .assertIsNone (ref (), f"Leaked object in '{ op_name } ' operation" )
564+
565+ def test_proxy_unref_binary_refcount (self ):
568566 class C :
569- def __pow__ (self , o , m = None ):
570- return NotImplemented
571-
572- # create dead proxy
573- o = C ()
574- dead = weakref .proxy (o )
575- del o
576- gc .collect ()
577-
578- # create live proxy
579- obj = C ()
580- ref = weakref .ref (obj )
581- proxy = weakref .proxy (obj )
582-
583- try :
584- pow (proxy , dead , None )
585- except ReferenceError :
586- pass
587-
588- del proxy , obj , dead
589- gc .collect ()
590-
591- self .assertIsNone (ref (), "Leaked object in pow operation" )
592-
567+ def __add__ (self , o ): return NotImplemented
568+ self ._assert_no_proxy_refcount_leak (C , operator .add , "Binary" )
569+
570+ def test_proxy_unref_ternary_refcount (self ):
571+ class C :
572+ def __pow__ (self , o , m = None ): return NotImplemented
573+ self ._assert_no_proxy_refcount_leak (C , lambda p , d : pow (p , d , None ), "Ternary" )
574+
593575 def test_proxy_unref_richcompare_refcount (self ):
594576 class C :
595- def __eq__ (self , o ):
596- return NotImplemented
597-
598- # create dead proxy
599- o = C ()
600- dead = weakref .proxy (o )
601- del o
602- gc .collect ()
603-
604- # create live proxy
605- obj = C ()
606- ref = weakref .ref (obj )
607- proxy = weakref .proxy (obj )
608-
609- try :
610- proxy == dead
611- except ReferenceError :
612- pass
613-
614- del proxy , obj , dead
615- gc .collect ()
616-
617- self .assertIsNone (ref (), "Leaked object in richcompare operation" )
577+ def __eq__ (self , o ): return NotImplemented
578+ self ._assert_no_proxy_refcount_leak (C , lambda p , d : p == d , "Rich Compare" )
618579
619580 def test_getweakrefcount (self ):
620581 o = C ()
0 commit comments