
    3j-5                        S SK r S SKrS SKrS SKJr  S SKrS SKr\ R                  R                  S5      r	\ R                  R                  S5      =(       d    \	r
\ R                  R                  S5      r\
=(       d    \r\ R                  R                  S5      r\=(       d    \ R                  R                  S5      r\ R                  R                  S5      r\ R                  R                  S	5      rS
 rS rS rS r " S S\5      r\" \S5      (       a   " S S\5      r\" 5       \l        \rOS r " S S\5      r " S S\5      rS rg)    N)wrapsGITHUB_ACTIONSTRAVISAPPVEYORGREENLET_MANYLINUXGREENLET_SKIP_LEAKCHECKS GREENLET_SKIP_FAILING_LEAKCHECKS GREENLET_ONLY_FAILING_LEAKCHECKSc                     SU l         U $ )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    R/home/wildlama/miniconda3/lib/python3.13/site-packages/greenlet/tests/leakcheck.pyignores_leakcheckr   J   s     !DK    c                    ^ ^ U U4S jnU$ )z
Return a decorator that marks the function to be ignored during
leakchecks (see `ignores_leakcheck`) when *condition* is true.

*message* describes why the leakcheck is ignored. When *condition*
is false, the function is returned unchanged.
c                 :   > T(       a  [        U 5      n TU l        U $ N)r   ignore_leakcheck_reason)r   	conditionmessages    r   	decorator'ignores_leakcheck_if.<locals>.decoratora   s    $T*D+2D(r    )r   r   r   s   `` r   ignores_leakcheck_ifr   Y   s    
 r   c                 b    SU l         [        (       a  [        R                  " S5      " U 5      n U $ )z*
Mark that the function is known to leak.
TzSkipping known failures)fails_leakcheckSKIP_FAILING_LEAKCHECKSunittestskipr   s    r   r   r   h   s+      D}}67=Kr   c                 J    [         R                  SS S::  a  [        U 5      $ U $ )zX
Mark the function as known to leak (fails refcount leakchecks) on Python 3.14 or less.
N   )      )sysversion_infor   r   s    r    fails_leakcheck_on_py314_or_lessr'   q   s)     w&t$$Kr   c                       \ rS rSrSrg)LeakCheckErrory   r   N)__name__
__module____qualname____firstlineno____static_attributes__r   r   r   r)   r)   y   s    r   r)   
getobjectsc                        \ rS rSrS rS rSrg)_MockGC   c                 .    [         R                  " S5      $ )Nr   )r%   r0   selfs    r   get_objects_MockGC.get_objects   s    >>!$$r   c                 "    [        [        U5      $ r   )getattrgc)r6   names     r   __getattr___MockGC.__getattr__   s    2t$$r   r   N)r+   r,   r-   r.   r7   r=   r/   r   r   r   r2   r2      s    	%	%r   r2   c                     U $ )z
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	     r   c                        \ rS rSrS rS rSrg)!ignores_types_in_strict_leakcheck   c                     Xl         g r   types)r6   rF   s     r   __init__*ignores_types_in_strict_leakcheck.__init__   s    
r   c                 (    U R                   Ul        U$ r   )rF   leakcheck_ignore_types)r6   r   s     r   __call__*ignores_types_in_strict_leakcheck.__call__   s    &*jj#r   rE   N)r+   r,   r-   r.   rG   rK   r/   r   r   r   rB   rB      s    r   rB   c                   L    \ rS rSrSrSrS rS rS rS r	S r
S	 rS
 rS rSrg)_RefCountChecker   r   )uop_executorc                 T    Xl         X l        / U l        0 U l        SU l        SU l        g )Nr   F)testcasefunctiondeltas
peak_statsignored_typesneeds_setUp)r6   rR   rS   s      r   rG   _RefCountChecker.__init__   s,       !r   c                    XL a  g[        U5      nU[        U R                  5      :X  a-   U R                  R                  U5      nU[
        La  U(       a  gU R                  R                  5        H	  nXL d  M	    g   X R                  ;   d)  X R                  ;   d  UR                  U R                  ;   a  gg! [         a!    U R                  R	                  U5      S:H  n Nf = f)NFr   T)type_include_object_p__eq__AttributeError__cmp__NotImplemented__dict__valuesrV   IGNORED_TYPESr+   IGNORED_TYPE_NAMES)r6   objkindexact_method_equalsxs        r   r[   "_RefCountChecker._include_object_p   s    
 ;Cy 4..//O&*&<&<&C&CC&H# #.8=P %%'Ax ( &&&)))}} 7 77 / " O '+&<&<&D&DS&IQ&N#	Os   B8 8(C#"C#c                 V    [         R                  " S U R                  U R                  S9$ )N)limitrU   filter)objgraphgrowthrU   r[   r5   s    r   _growth_RefCountChecker._growth   s$    Tdoo&*&<&<> 	>r   c                     U(       d  g/ n[        S U 5       5      nU H  u  pEnUR                  SX4XV4-  5        M     SR                  U5      nU$ )Nz<Unable to calculate growth>c              3   @   #    U  H  u  n  n[        U5      v   M     g 7fr   )len).0r<   _s      r   	<genexpr>0_RefCountChecker._report_diff.<locals>.<genexpr>   s     7*$1CIIs   z%-*s%9d %+9d
)maxappendjoin)r6   rm   lineswidthr<   countdeltadiffs           r   _report_diff_RefCountChecker._report_diff   sW    1777"(DLL5*EEF #) yyr   c                    [         R                  " 5       n[         R                  " 5         U R                  (       a+  U R                  R                  5         SU R                  l         U R                  " U R                  /UQ70 UD6  U R                  R                  5         U R                  R                  5         SU R                  l        SU l        U(       a  [         R                  " 5         g g ! U R                  R                  5         U R                  R                  5         SU R                  l        SU l        U(       a  [         R                  " 5         f f = f)NFT)r;   	isenableddisablerW   rR   setUpskipTearDownrS   tearDown
doCleanupsenable)r6   argskwargs
gc_enableds       r   	_run_test_RefCountChecker._run_test   s    \\^



MM!).DMM&	MM$--9$9&9MM""$MM$$&)-DMM&#D		 	 MM""$MM$$&)-DMM&#D		 s   ( C2 2A+Ec                     S[         R                  ;   a!  [         R                  S   R                  5         S[         R                  ;   a!  [         R                  S   R                  5         U R                  5       $ )Nurlparsezurllib.parse)r%   modulesclear_cachern   r5   s    r   _growth_after_RefCountChecker._growth_after  sR     $KK
#//1S[[(KK'335||~r   c                    U R                   nU(       d  g[        R                  (       a  [        S[        R                  < 35      eUSS  SS/:X  a  [	        U5      S;   a  gUSS  / SQ:X  a  g[	        U5      S	:  a  [        US
S  5      S:X  a  g[	        U5      S:  aE  US   S:  a<  US   US   :X  a0  US   US   :X  a$  U R                  U5      n[        SU< SU< 35      e[        USS  5      S::  d*  [        US
S  5      S::  d  US
S  R                  S5      S:  a  SnOSn[	        U5      U:  a"  [        SU< SU R                  U5      < 35      eg)NTz Generated uncollectable garbage r   )r"   r#   F)r   r   r      r#   zrefcount increased by rw   r"         )rT   r;   garbager)   rr   sumr   r}   )r6   rm   rT   r   rj   s        r   _check_deltas_RefCountChecker._check_deltas  sZ   
 :: !UVV "#;1a& S[F%:"#;)#v;!F23K 0A 5v;!r
Q6":3KPVWYPZ^deg^hPh$$V,D 64!PQQ vbc{q Crs$4$9VBC[=N=Nq=QUV=VEEv;% $*$($5$5f$="? @ @
 r   c                 p   [        S5       H  n[        R                  " 5         M     [        U R                  SS5      nU(       a  SU R
                  l        [        U R                  SS5      U l        U R                  5       n U R                  U5      (       ad  U R                  X5        U R                  5       nU R                  R                  [        S U 5       5      5        U R                  U5      (       a  Md  U(       a  [        SU R                  < S	35      eg ! [         a    U(       d  e  g f = f)
Nr#   r   FTrJ   r   c              3   *   #    U  H	  oS    v   M     g7f)r"   Nr   )rs   stats     r   ru   ,_RefCountChecker.__call__.<locals>.<genexpr>Q  s     'CFDQFs   z	Expected z to leak but it did not.)ranger;   collectr:   rS   rR   expect_greenlet_leakrV   rn   r   r   r   rT   ry   r   r)   )r6   r   r   rt   expect_failurerm   s         r   rK   _RefCountChecker.__call__>  s    qAJJL  !0A5I15DMM.$T]]4LbQ 	_$$V,,t,++-""3'CF'C#DE $$V,, $dmm%]^^ 	  	! "	s   A8D   D54D5)rT   rS   rV   rW   rU   rR   N)r+   r,   r-   r.   rb   rc   rG   r[   rn   r   r   r   r   rK   r/   r   r   r   rN   rN      s<    
 M	!(T>
"/b_r   rN   c                    ^  [        T SS5      (       d  [        (       aK  [        T SS 5      nU(       a5  [        (       d*  [        ST R                  < SU< 3[        R
                  S9  T $ [        T 5      U 4S j5       nU$ )Nr   Fr   zIgnoring leakchecks for z: )filec                    > [        U SS5      (       a  [        R                  " S5      e[        (       a(  [        TSS5      (       d  [        R                  " S5      e[	        U T5      " X5      $ )Nr   Fz$This class ignored during leakchecksr   z(Only running tests that fail leakchecks.)r:   r   SkipTestONLY_FAILING_LEAKCHECKSrN   )r6   r   r   methods      r   wrapperwrap_refcount.<locals>.wrapperc  s^    4+U33##$JKK""76;Le+T+T##$NOOf-d;;r   )r:   SKIP_LEAKCHECKSprintr+   r%   stderrr   )r   reasonr   s   `  r   wrap_refcountr   Y  sl    v)511__!:DA//4:OOVLZZ 
6]< < Nr   )osr%   r;   	functoolsr   r   rl   environgetRUNNING_ON_GITHUB_ACTIONSRUNNING_ON_TRAVISRUNNING_ON_APPVEYORRUNNING_ON_CIRUNNING_ON_MANYLINUXr   r   r   r   r   r   r'   AssertionErrorr)   hasattrobjectr2   r@   rB   rN   r   r   r   r   <module>r      s0  0 
 
 	   B JJNN+;< JJNN8,I0I jjnnZ0 !8%8zz~~&:; &T"**..9S*T**..)KL **..)KL 	^ 	 3%& %
 )HK, ~_v ~_@r   