
    fj                         S SK r S SKrS SKrS SKrSSKJr  SSKJr  SSKJr  \R                  (       d   e " S S\5      r
g)    N   )TestCase)RUNNING_ON_FREETHREAD_BUILD) fails_leakcheck_on_py314_or_lessc                   N    \ rS rSrS rS rS r\S 5       rS r	S r
S rS	 rS
rg)TestGC   c                    [         R                  " [        R                  " [        R                  5      R	                  5       5      n[
        R                  " 5         U" 5       b%  [        S[        R                  " U" 5       5      5        U R                  U" 5       5        U R                  [
        R                  [
        R                  5        g )NzO IS NOT NONE.)weakrefrefgreenlet
getcurrentswitchgccollectprintsysgetrefcountassertIsNoneassertFalsegarbage)selfos     O/var/www/html/GQ-WA/venv/lib/python3.13/site-packages/greenlet/tests/test_gc.pytest_dead_circular_refTestGC.test_dead_circular_ref   sx    KK))(*=*=>EEGH


3?"COOAC$89!#RZZ0    c                 .    " S S[         R                   5      nU" 5       nX"l        [        R                  " U5      n[        R
                  " 5         U R                  U" 5       5        U R                  [        R                  [        R                  5        g )Nc                       \ rS rSrSrSrg)8TestGC.test_circular_greenlet.<locals>.circular_greenlet   N )__name__
__module____qualname____firstlineno__r   __static_attributes__r"   r   r   circular_greenletr       s    Dr   r(   )	r   r   r   r   r   r   r   r   r   )r   r(   r   s      r   test_circular_greenletTestGC.test_circular_greenlet   s_    	 1 1 	KKN


!#RZZ0r   c                 "    " S S[         R                   5      nU" 5       n[        R                  " U5      n[        R                  " 5         U R                  U" 5       5        U R                  [        R                  [        R                  5        g )Nc                        \ rS rSrS rS rSrg)3TestGC.test_inactive_ref.<locals>.inactive_greenlet#   c                 R    [         R                   R                  X R                  S9  g )N)run)r   __init__r0   r   s    r   r1   <TestGC.test_inactive_ref.<locals>.inactive_greenlet.__init__$   s    !!**4XX*>r   c                     g Nr"   r2   s    r   r0   7TestGC.test_inactive_ref.<locals>.inactive_greenlet.run'       r   r"   N)r#   r$   r%   r&   r1   r0   r'   r"   r   r   inactive_greenletr-   #   s    ?r   r8   )r   r   r   r   r   r   r   r   )r   r8   r   s      r   test_inactive_refTestGC.test_inactive_ref"   s\    	 1 1 	 KKN


!#RZZ0r   c                 4  ^^  " S S[         5      m/ n[        R                  " 5       mUU4S jn[        R                  " U5      nXl        UR	                  U5        UR                  5         AA[        R                  " 5         [        R                  " 5         g )Nc                       \ rS rSrS rSrg):TestGC.test_finalizer_crash.<locals>.object_with_finalizerB   c                     g r5   r"   r2   s    r   __del__BTestGC.test_finalizer_crash.<locals>.object_with_finalizer.__del__C   r7   r   r"   N)r#   r$   r%   r&   r@   r'   r"   r   r   object_with_finalizerr=   B   s    r   rB   c                    > T " 5       [         R                  " 5       l         TR                  5         [         R                  " 5       ?g ! [         R                   a    [        S5         N7f = f! [         R                  " 5       ?f = f)NzGot greenlet exit!)r   r   objectr   GreenletExitr   )rB   parents   r   greenlet_body2TestGC.test_finalizer_crash.<locals>.greenlet_bodyG   sh    +@+BH!(1 '')0 (( ,*+, '')0s#   A A*'A- )A**A- -B)rD   r   r   arrayappendr   r   r   )r   rI   rG   grB   rF   s       @@r   test_finalizer_crashTestGC.test_finalizer_crash/   so    &	F 	 $$&	1 m,Q	



r   c                     [         (       d  U R                  S5        U R                  S5      nU R                  SU5        g )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_refs,TestGC.test_issue515_freethread_c_stack_refsX   s4     +*MMBC!BCnf-r   c                     [         (       d  U R                  S5        U R                  S5      nU R                  SU5        g )NrO   z!fail_c_stack_refs_suspended_gc.pyzC STACK REFS GC OKrP   rT   s     r   test_c_stack_refs_suspended_gc%TestGC.test_c_stack_refs_suspended_gcc   s5     +*MMBC!DE*F3r   c                     [         R                  S:  a  U R                  S5        SS KnS nUR	                  U[        5       5        g )N   r	   Test is 3.15+ onlyr   c                      g)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_doctest:TestGC.test_crashing_deferred_object.<locals>.with_doctestv       r   r   version_inforQ   doctestrun_docstring_examplesdictr   re   r`   s      r   test_crashing_deferred_object$TestGC.test_crashing_deferred_objectr   s9    g%MM./	 	&&|TV<r   c                     [         R                  S:  a  U R                  S5        SS KnS nUR	                  U[        5       5        g )Nr\   r^   r   c                      g)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   r`   :TestGC.test_cycle_in_suspended_frame.<locals>.with_doctest   rb   r   rc   rh   s      r   test_cycle_in_suspended_frame$TestGC.test_cycle_in_suspended_frame   s9    g%MM./	> 	&&|TV<r   r"   N)r#   r$   r%   r&   r   r)   r9   r   rL   rV   rY   ri   rn   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>rs      s;    	  
   ) 7  U=X U=r   