
    ijk                     z    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 ddlmZ ej                  sJ  G d de      Z
y)    N   )TestCase)RUNNING_ON_FREETHREAD_BUILD) fails_leakcheck_on_py314_or_lessc                   F    e Zd Zd Zd Zd Zed        Zd Z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     I/root/.hermes/venv/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__C   r.   r   N)r   r    r!   r5   r"   r   r   object_with_finalizerr3   B   s    r   r6   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   )r6   parents   r   greenlet_bodyz2TestGC.test_finalizer_crash.<locals>.greenlet_bodyG   sh    +@+BH!(1 '')0 (( ,*+, '')0s#   A A'$A* &A''A* *B )r8   r   r   arrayappendr   r   r   )r   r<   r;   gr6   r:   s       @@r   test_finalizer_crashzTestGC.test_finalizer_crash/   sq    &	F 	 $$&	1 m,Q	



r   c                 x    t         s| j                  d       | j                  d      }| j                  d|       y )N&Only free-threaded builds are affectedzfail_issue_515_freethread_gc.pyzISSUE 515 OKr   skipTest
run_scriptassertInr   outputs     r   %test_issue515_freethread_c_stack_refsz,TestGC.test_issue515_freethread_c_stack_refsX   s1     +MMBC!BCnf-r   c                 x    t         s| j                  d       | j                  d      }| j                  d|       y )NrA   z!fail_c_stack_refs_suspended_gc.pyzC STACK REFS GC OKrB   rF   s     r   test_c_stack_refs_suspended_gcz%TestGC.test_c_stack_refs_suspended_gcc   s2    
 +MMBC!DE*F3r   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_doctestq       r   r   version_inforC   doctestrun_docstring_examplesdictr   rU   rQ   s      r   test_crashing_deferred_objectz$TestGC.test_crashing_deferred_objectm   s9    g%MM./	 	&&|TV<r   c                     t         j                  dk  r| j                  d       dd l}d }|j	                  |t                      y )NrL   rO   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   rQ   z:TestGC.test_cycle_in_suspended_frame.<locals>.with_doctest   rR   r   rS   rX   s      r   test_cycle_in_suspended_framez$TestGC.test_cycle_in_suspended_frame|   s9    g%MM./	> 	&&|TV<r   N)r   r    r!   r   r$   r0   r   r?   rH   rJ   rY   r\   r"   r   r   r   r      s:    111 && &&P	.4=#=r   r   )r   r
   r   r    r   r   	leakcheckr   GREENLET_USE_GCr   r"   r   r   <module>r`      s;    	  
   ) 7  P=X P=r   