
    [h.                        d dl mZ d dlZd dlZd dlZd dlmZ d dlZd dlZej	        
                    d          Zej	        
                    d          peZej	        
                    d          ZepeZej	        
                    d          Zepej	        
                    d          Zej	        
                    d	          Zej	        
                    d
          Zd Zd Z G d de          Z eed          r  G d de          Z e            e_        eZnd Z G d de          Z G d de          Zd ZdS )    )print_functionN)wrapsGITHUB_ACTIONSTRAVISAPPVEYORGREENLET_MANYLINUXGREENLET_SKIP_LEAKCHECKS GREENLET_SKIP_FAILING_LEAKCHECKS GREENLET_ONLY_FAILING_LEAKCHECKSc                     d| _         | S )a  
    Ignore the given object during leakchecks.

    Can be applied to a method, in which case the method will run, but
    will not be subject to leak checks.

    If applied to a class, the entire class will be skipped during leakchecks. This
    is intended to be used for classes that are very slow and cause problems such as
    test timeouts; typically it will be used for classes that are subclasses of a base
    class and specify variants of behaviour (such as pool sizes).
    T)ignore_leakcheckfuncs    g/var/www/api.easyaligner.net/htdocs/venv_linux/lib/python3.11/site-packages/greenlet/tests/leakcheck.pyignores_leakcheckr   L   s     !DK    c                 \    d| _         t          r t          j        d          |           } | S )z2
    Mark that the function is known to leak.
    TzSkipping known failures)fails_leakcheckSKIP_FAILING_LEAKCHECKSunittestskipr   s    r   r   r   [   s3      D >7x}677==Kr   c                       e Zd ZdS )LeakCheckErrorN)__name__
__module____qualname__ r   r   r   r   d   s        Dr   r   
getobjectsc                       e Zd Zd Zd ZdS )_MockGCc                 *    t          j        d          S )Nr   )sysr   selfs    r   get_objectsz_MockGC.get_objectsl   s    >!$$$r   c                 ,    t          t          |          S N)getattrgc)r$   names     r   __getattr__z_MockGC.__getattr__n   s    2t$$$r   N)r   r   r   r%   r+   r   r   r   r    r    k   s2        	% 	% 	%	% 	% 	% 	% 	%r   r    c                     | S )a  
        Decorator for a function that is known to fail when running
        strict (``sys.getobjects()``) leakchecks.

        This type of leakcheck finds all objects, even those, such as
        strings, which are not tracked by the garbage collector.
        r   r   s    r   fails_strict_leakcheckr-   s   s	     r   c                       e Zd Zd Zd ZdS )!ignores_types_in_strict_leakcheckc                     || _         d S r'   )types)r$   r1   s     r   __init__z*ignores_types_in_strict_leakcheck.__init__~   s    


r   c                     | j         |_        |S r'   )r1   leakcheck_ignore_types)r$   r   s     r   __call__z*ignores_types_in_strict_leakcheck.__call__   s    &*j#r   N)r   r   r   r2   r5   r   r   r   r/   r/   }   s2              r   r/   c                   B    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
S )_RefCountCheckerr   c                 Z    || _         || _        g | _        i | _        d| _        d| _        d S )Nr   F)testcasefunctiondeltas
peak_statsignored_typesneeds_setUp)r$   r9   r:   s      r   r2   z_RefCountChecker.__init__   s6       !r   c                 |   || u rdS t          |          }|t          | j                  k    rW	 | j                            |          }n.# t          $ r! | j                            |          dk    }Y nw xY w|t
          ur|rdS | j                                        D ]	}||u r dS 
|| j        v s	|| j	        v rdS dS )NFr   T)
type_include_object_p__eq__AttributeError__cmp__NotImplemented__dict__valuesr=   IGNORED_TYPES)r$   objkindexact_method_equalsxs        r   rA   z"_RefCountChecker._include_object_p   s   
 $;;5Cyy 4.////O&*&<&C&CC&H&H##! O O O '+&<&D&DS&I&IQ&N###	O #.88=P8u %%'' 	 	Aaxxuu  4%%%1C)C)C5ts   A
 
(A54A5c                 D    t          j        d | j        | j                  S )N)limitr<   filter)objgraphgrowthr<   rA   r#   s    r   _growthz_RefCountChecker._growth   s'    Tdo&*&<> > > 	>r   c                     |sdS g }t          d |D                       }|D ]"\  }}}|                    d||||fz             #d                    |          }|S )Nz<Unable to calculate growth>c              3   <   K   | ]\  }}}t          |          V  d S r'   )len).0r*   _s      r   	<genexpr>z0_RefCountChecker._report_diff.<locals>.<genexpr>   s.      77*$1CII777777r   z%-*s%9d %+9d
)maxappendjoin)r$   rQ   lineswidthr*   countdeltadiffs           r   _report_diffz_RefCountChecker._report_diff   s     	2117777777"( 	G 	GD%LL5$u*EEFFFFyyr   c                 P   t          j                    }t          j                     | j        r%| j                                         d| j        _        	  | j        | j        g|R i | | j                                         | j        	                                 d| j        _        d| _        |rt          j
                     d S d S # | j                                         | j        	                                 d| j        _        d| _        |rt          j
                     w w xY w)NFT)r)   	isenableddisabler>   r9   setUpskipTearDownr:   tearDown
doCleanupsenable)r$   argskwargs
gc_enableds       r   	_run_testz_RefCountChecker._run_test   s   \^^


 	/M!!!).DM&	DM$-9$999&999M""$$$M$$&&&)-DM&#D 	 	 M""$$$M$$&&&)-DM&#D 	s   C AD%c                     dt           j        v r$t           j        d                                          dt           j        v r$t           j        d                                          |                                 S )Nurlparsezurllib.parse)r"   modulesclear_cacherR   r#   s    r   _growth_afterz_RefCountChecker._growth_after   s^     $$K
#//111S[((K'33555||~~r   c                 >   | j         }|sdS t          j        rt          dt          j                  |dd          ddgk    rt	          |          dv rdS |dd          g dk    rdS t	          |          d	k    rt          |d
d                    dk    rdS t	          |          dk    rZ|d         dk    rN|d         |d         k    r<|d         |d         k    r*|                     |          }t          d|d|          t          |dd                    dk    s<t          |d
d                    dk    s!|d
d                              d          dk    rd}nd}t	          |          |k    r(t          d|d|                     |                    dS )NTz Generated uncollectable garbage r   )      F)r   r   r      rw   zrefcount increased by rY   rv         )r;   r)   garbager   rU   sumrb   r_   )r$   rQ   r;   ra   rN   s        r   _check_deltasz_RefCountChecker._check_deltas   s   
  	4: 	W .!UVVV "##;1a&  S[[F%:%:5"##;)))##5v;;!F233K 0 0A 5 55v;;!r
Q6":3K3KPVWYPZ^deg^hPhPh$$V,,D .66644!PQQQ vbcc{q  Crss$4$4$9$9VBCC[=N=Nq=Q=QUV=V=VEEEv;;% .$*FF$($5$5f$=$=$="? @ @ @
 tr   c                 ^   t          d          D ]}t          j                     t          | j        dd          }|rd| j        _        t          | j        dd          | _        |                                 }	 | 	                    |          rp| 
                    ||           |                                 }| j                            t          d |D                                  | 	                    |          p|rt          d| j        d	          d S # t          $ r |s Y d S w xY w)
Nrw   r   FTr4   r   c              3   &   K   | ]}|d          V  dS )rv   Nr   )rV   stats     r   rX   z,_RefCountChecker.__call__.<locals>.<genexpr>+  s&      'C'CDQ'C'C'C'C'C'Cr   z	Expected z to leak but it did not.)ranger)   collectr(   r:   r9   expect_greenlet_leakr=   rR   r   rn   rs   r;   r[   r   r   )r$   rk   rl   rW   expect_failurerQ   s         r   r5   z_RefCountChecker.__call__  s_   q 	 	AJLLLL 0A5II 	615DM.$T]4LbQQ 	_$$V,, FtV,,,++--""3'C'CF'C'C'C#D#DEEE $$V,, F  _$ndmmm%]^^^_ _	  	 	 	!   	s   :BD D,+D,N)r   r   r   rH   r2   rA   rR   rb   rn   rs   r   r5   r   r   r   r7   r7      s        
 M	! 	! 	!# # #J> > >
 
 
  "  / / /b_ _ _ _ _r   r7   c                 p     t           dd          st          r S t                      fd            }|S )Nr   Fc                     t          | dd          rt          j        d          t          r%t          dd          st          j        d           t	          |           ||          S )Nr   Fz$This class ignored during leakchecksr   z(Only running tests that fail leakchecks.)r(   r   SkipTestONLY_FAILING_LEAKCHECKSr7   )r$   rk   rl   methods      r   wrapperzwrap_refcount.<locals>.wrapper7  sx    4+U33 	L#$JKKK" 	P76;Le+T+T 	P#$NOOO-f--dF;;;r   )r(   SKIP_LEAKCHECKSr   )r   r   s   ` r   wrap_refcountr   3  sT    v)511 _ 
6]]< < < < ]< Nr   )
__future__r   osr"   r)   	functoolsr   r   rP   environgetRUNNING_ON_GITHUB_ACTIONSRUNNING_ON_TRAVISRUNNING_ON_APPVEYORRUNNING_ON_CIRUNNING_ON_MANYLINUXr   r   r   r   r   AssertionErrorr   hasattrobjectr    r-   r/   r7   r   r   r   r   <module>r      s0  0 & % % % % % 				 



 				        B JNN+;<< JNN8,,I0I jnnZ00 !8%8z~~&:;; &T"*..9S*T*T*..)KLL *..)KLL     	 	 	 	 	^ 	 	 	 73 % % % % %& % % %
 '))HK,         m_ m_ m_ m_ m_v m_ m_ m_^    r   