
    Yj                     x    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
dS )    N   )TestCase)RUNNING_ON_FREETHREAD_BUILD) fails_leakcheck_on_py314_or_lessc                   N    e Zd Zd Zd Zd Zed             Zd Zd Z	d Z
d Zd	S )
TestGCc                    t          j        t          j        t          j                                                            }t          j                      |            *t          dt          j	         |                                 | 
                     |                       |                     t
          j        t
          j                   d S )NzO IS NOT NONE.)weakrefrefgreenlet
getcurrentswitchgccollectprintsysgetrefcountassertIsNoneassertFalsegarbage)selfos     Z/var/www/app.qaans.com/backend/venv/lib/python3.11/site-packages/greenlet/tests/test_gc.pytest_dead_circular_refzTestGC.test_dead_circular_ref   s    K)(*=>>EEGGHH

133?"COAACC$8$8999!!##RZ00000    c                 4    G d dt           j                   } |            }||_        t          j        |          }t	          j                     |                      |                       |                     t          j        t          j                   d S )Nc                       e Zd ZdZdS )8TestGC.test_circular_greenlet.<locals>.circular_greenletN)__name__
__module____qualname__r    r   r   circular_greenletr      s        DDDr   r#   )	r   r   r
   r   r   r   r   r   r   )r   r#   r   s      r   test_circular_greenletzTestGC.test_circular_greenlet   s    	 	 	 	 	 1 	 	 	KNN

!!##RZ00000r   c                 &    G d dt           j                   } |            }t          j        |          }t          j                     |                      |                       |                     t          j        t          j                   d S )Nc                       e Zd Zd Zd ZdS )3TestGC.test_inactive_ref.<locals>.inactive_greenletc                 R    t           j                             | | j                   d S )N)run)r   __init__r)   r   s    r   r*   z<TestGC.test_inactive_ref.<locals>.inactive_greenlet.__init__$   s&    !**4TX*>>>>>r   c                     d S 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'   #   s2        ? ? ?    r   r/   )r   r
   r   r   r   r   r   r   )r   r/   r   s      r   test_inactive_refzTestGC.test_inactive_ref"   s    	 	 	 	 	 1 	 	 	 KNN

!!##RZ00000r   c                 >    G d dt                     g }t          j                    fd}t          j        |          }||_        |                    |           |                                 ~~t          j                     t          j                     d S )Nc                       e Zd Zd ZdS ):TestGC.test_finalizer_crash.<locals>.object_with_finalizerc                     d S 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                    _        	                                  n$# t           j        $ r t          d           Y nw xY wt          j                    `d S # 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   s    +@+@+B+BH!!(1( , , ,*+++++, '))000H'))00000s&   8 A1 AA1 AA1 1B)r8   r   r   arrayappendr   r   r   )r   r<   r;   gr6   r:   s       @@r   test_finalizer_crashzTestGC.test_finalizer_crash/   s    &	 	 	 	 	F 	 	 	 $&&	1 	1 	1 	1 	1 	1 m,,Q	




r   c                     t           s|                     d           |                     d          }|                     d|           d S )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   sL     + 	DMMBCCC!BCCnf-----r   c                     t           s|                     d           |                     d          }|                     d|           d S )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   sM     + 	DMMBCCC!DEE*F33333r   c                     t           j        dk     r|                     d           dd l}d }|                    |t                                 d S )N      Test is 3.15+ onlyr   c                      dS )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_doctestv         r   r   version_inforC   doctestrun_docstring_examplesdictr   rU   rQ   s      r   test_crashing_deferred_objectz$TestGC.test_crashing_deferred_objectr   s]    g%%MM.///	 	 	 	&&|TVV<<<<<r   c                     t           j        dk     r|                     d           dd l}d }|                    |t                                 d S )NrL   rO   r   c                      dS )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   s]    g%%MM.///	 	 	> 	&&|TVV<<<<<r   N)r   r    r!   r   r$   r0   r   r?   rH   rJ   rY   r\   r"   r   r   r   r      s        1 1 11 1 11 1 1 && & &%&P	. 	. 	.4 4 4= = =#= #= #= #= #=r   r   )r   r
   r   r    r   r   	leakcheckr   GREENLET_USE_GCr   r"   r   r   <module>r`      s    				  



        ) ) ) ) ) ) 7 7 7 7 7 7    U= U= U= U= U=X U= U= U= U= U=r   