
    R3jo                     n    d dl Z d dlZd dlZd dlZddlmZ ddlmZ ej                  sJ  G d de      Z	y)    N   )TestCase) fails_leakcheck_on_py314_or_lessc                   :    e Zd Zd Zd Zd Zed        Zd Zd Z	y)TestGCc                    t        j                  t        j                  t        j                        j	                               }t        j                           |       $t        dt        j                   |                    | j                   |              | j                  t
        j                  t
        j                         y )NzO IS NOT NONE.)weakrefrefgreenlet
getcurrentswitchgccollectprintsysgetrefcountassertIsNoneassertFalsegarbage)selfos     C/DATA/.local/lib/python3.12/site-packages/greenlet/tests/test_gc.pytest_dead_circular_refzTestGC.test_dead_circular_ref   sx    KK))(*=*=>EEGH


3?"COOAC$89!#RZZ0    c                 ,    G d dt         j                         } |       }||_        t        j                  |      }t	        j
                          | j                   |              | j                  t        j                  t        j                         y )Nc                       e Zd ZdZy)8TestGC.test_circular_greenlet.<locals>.circular_greenletN)__name__
__module____qualname__r    r   r   circular_greenletr      s    Dr   r"   )	r   r   r	   r
   r   r   r   r   r   )r   r"   r   s      r   test_circular_greenletzTestGC.test_circular_greenlet   sa    	 1 1 	KKN


!#RZZ0r   c                     G d dt         j                         } |       }t        j                  |      }t        j                          | j                   |              | j                  t        j                  t        j                         y )Nc                       e Zd Zd Zd Zy)3TestGC.test_inactive_ref.<locals>.inactive_greenletc                 Z    t         j                   j                  | | j                         y )N)run)r   __init__r(   r   s    r   r)   z<TestGC.test_inactive_ref.<locals>.inactive_greenlet.__init__#   s    !!**4TXX*>r   c                      y Nr!   r*   s    r   r(   z7TestGC.test_inactive_ref.<locals>.inactive_greenlet.run&       r   N)r   r   r    r)   r(   r!   r   r   inactive_greenletr&   "   s    ?r   r.   )r   r	   r
   r   r   r   r   r   )r   r.   r   s      r   test_inactive_refzTestGC.test_inactive_ref!   s\    	 1 1 	 KKN


!#RZZ0r   c                 ,    G d dt               g }t        j                         fd}t        j                  |      }||_        |j	                  |       |j                          ~~t        j                          t        j                          y )Nc                       e Zd Zd Zy):TestGC.test_finalizer_crash.<locals>.object_with_finalizerc                      y r,   r!   r*   s    r   __del__zBTestGC.test_finalizer_crash.<locals>.object_with_finalizer.__del__B   r-   r   N)r   r   r    r4   r!   r   r   object_with_finalizerr2   A   s    r   r5   c                              t        j                         _        	 j                          t        j                         `y # t         j                  $ r t        d       Y 5w xY w# t        j                         `w xY w)NzGot greenlet exit!)r   r   objectr   GreenletExitr   )r5   parents   r   greenlet_bodyz2TestGC.test_finalizer_crash.<locals>.greenlet_bodyF   sh    +@+BH!(1 '')0 (( ,*+, '')0s#   A A'$A* &A''A* *B )r7   r   r   arrayappendr   r   r   )r   r;   r:   gr5   r9   s       @@r   test_finalizer_crashzTestGC.test_finalizer_crash.   sq    &	F 	 $$&	1 m,Q	



r   c                     t         j                  dk  r| j                  d       dd l}d }|j	                  |t                      y )N      Test is 3.15+ onlyr   c                       y)z
            >>> import gc
            >>> from greenlet import getcurrent, greenlet, GreenletExit
            >>> def outer():
            ...     gc.collect()
            >>> outer_glet = greenlet(outer)
            >>> outer_glet.switch()
            Nr!   r!   r   r   with_doctestz:TestGC.test_crashing_deferred_object.<locals>.with_doctest[       r   r   version_infoskipTestdoctestrun_docstring_examplesdictr   rJ   rE   s      r   test_crashing_deferred_objectz$TestGC.test_crashing_deferred_objectW   s9    g%MM./	 	&&|TV<r   c                     t         j                  dk  r| j                  d       dd l}d }|j	                  |t                      y )Nr@   rC   r   c                       y)a  
            >>> import gc
            >>> from greenlet import getcurrent, greenlet
            >>> class Cycle:
            ...     def __del__(self):
            ...         print("(Running finalizer)")
            >>> def collect_it():
            ...     print("Collecting garbage")
            ...     gc.collect()
            >>> def inner():
            ...     cycle1 = Cycle()
            ...     cycle2 = Cycle()
            ...     cycle1.cycle = cycle2
            ...     cycle2.cycle = cycle1
            ...     getcurrent().parent.switch()
            >>> def outer():
            ...     glet = greenlet(inner)
            ...     glet.switch()
            ...     collect_it()

            >>> outer_glet = greenlet(outer)
            >>> outer_glet.switch()
            Collecting garbage
            >>> outer_glet.dead
            True
            >>> collect_it()
            Collecting garbage
            (Running finalizer)
            (Running finalizer)
            Nr!   r!   r   r   rE   z:TestGC.test_cycle_in_suspended_frame.<locals>.with_doctestj   rF   r   rG   rM   s      r   test_cycle_in_suspended_framez$TestGC.test_cycle_in_suspended_framef   s9    g%MM./	> 	&&|TV<r   N)
r   r   r    r   r#   r/   r   r>   rN   rQ   r!   r   r   r   r      s0    111 && &&P=#=r   r   )
r   r	   r   r    r   	leakcheckr   GREENLET_USE_GCr   r!   r   r   <module>rU      s8    	  
   7  {=X {=r   