@@ -538,44 +538,83 @@ class MyObj:
538538 with self .assertRaises (TypeError ):
539539 hash (weakref .proxy (obj ))
540540
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 ()
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 ()
545548 dead = weakref .proxy (o )
546549 del o
547550 gc .collect ()
548-
549- # Create live proxy
550- obj = make_class ()
551+
552+ # create live proxy
553+ obj = C ()
551554 ref = weakref .ref (obj )
552555 proxy = weakref .proxy (obj )
553-
554- # run operation
556+
555557 try :
556- do_op (proxy , dead )
558+ operator . add (proxy , dead )
557559 except ReferenceError :
558560 pass
561+
559562 del proxy , obj , dead
560563 gc .collect ()
561-
562- # verify
563- self .assertIsNone (ref (), f"Leaked object in '{ op_name } ' operation" )
564-
565- def test_proxy_unref_binary_refcount (self ):
566- class C :
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 ):
564+
565+ self .assertIsNone (ref (), "Leaked object in add operation" )
566+
567+ def test_proxy_unref_pow_refcount (self ):
571568 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-
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+
575593 def test_proxy_unref_richcompare_refcount (self ):
576594 class C :
577- def __eq__ (self , o ): return NotImplemented
578- self ._assert_no_proxy_refcount_leak (C , lambda p , d : p == d , "Rich Compare" )
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" )
579618
580619 def test_getweakrefcount (self ):
581620 o = C ()
0 commit comments