
    +h.                     z   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                  j                  d      Zej                  j                  d      xs eZej                  j                  d      Zexs eZej                  j                  d      Zexs ej                  j                  d      Zej                  j                  d	      Zej                  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y)    )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    K/var/www/html/venv/lib/python3.12/site-packages/greenlet/tests/leakcheck.pyignores_leakcheckr   L   s     !DK    c                 V    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   [   s*      D7x}}67=Kr   c                       e Zd Zy)LeakCheckErrorN)__name__
__module____qualname__ r   r   r   r   d   s    r   r   
getobjectsc                       e Zd Zd Zd Zy)_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   s    	%	%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y)!ignores_types_in_strict_leakcheckc                     || _         y 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    &*jj#r   N)r   r   r   r2   r5   r   r   r   r/   r/   }   s    r   r/   c                   @    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zy
)_RefCountCheckerr   c                 X    || _         || _        g | _        i | _        d| _        d| _        y )Nr   F)testcasefunctiondeltas
peak_statsignored_typesneeds_setUp)r$   r9   r:   s      r   r2   z_RefCountChecker.__init__   s0       !r   c                    || u ryt        |      }|t        | j                        k(  r'	 | j                  j                  |      }|t
        ur|ry| j                  j                         D ]  }||u s y || j                  v s|| j                  v ryy# t        $ r! | j                  j	                  |      dk(  }Y ww xY w)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    
 $;Cy 4..//O&*&<&<&C&CC&H# #.8=P %%' 	Aax	
 4%%%1C1C)C% " O '+&<&<&D&DS&IQ&N#	Os   B 'B=<B=c                 Z    t        j                  d | j                  | j                        S )N)limitr<   filter)objgraphgrowthr<   rA   r#   s    r   _growthz_RefCountChecker._growth   s$    Tdoo&*&<&<> 	>r   c                     |syg }t        d |D              }|D ]  \  }}}|j                  d||||fz           dj                  |      }|S )Nz<Unable to calculate growth>c              3   :   K   | ]  \  }}}t        |        y wr'   )len).0r*   _s      r   	<genexpr>z0_RefCountChecker._report_diff.<locals>.<genexpr>   s     7*$1CI7s   z%-*s%9d %+9d
)maxappendjoin)r$   rQ   lineswidthr*   countdeltadiffs           r   _report_diffz_RefCountChecker._report_diff   sd    1777"( 	GD%LL5$u*EEF	G yyr   c                    t        j                         }t        j                          | j                  r+| j                  j                          d| j                  _        	  | j                  | j                  g|i | | j                  j                          | j                  j                          d| j                  _        d| _        |rt        j                          y y # | j                  j                          | 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    \\^



MM!).DMM&	DMM$--9$9&9MM""$MM$$&)-DMM&#D		 	 MM""$MM$$&)-DMM&#D		 s   ! C% %A%E
c                     dt         j                  v r!t         j                  d   j                          dt         j                  v r!t         j                  d   j                          | j                         S )Nurlparsezurllib.parse)r"   modulesclear_cacherR   r#   s    r   _growth_afterz_RefCountChecker._growth_after   sR     $KK
#//1S[[(KK'335||~r   c                 t   | j                   }|syt        j                  rt        dt        j                        |dd  ddgk(  rt	        |      dv ry|dd  g dk(  ryt	        |      d	k\  rt        |d
d        dk(  ryt	        |      dk\  r@|d   dkD  r8|d   |d   k(  r-|d   |d   k(  r"| j                  |      }t        d|d|      t        |dd        dk  s(t        |d
d        dk  s|d
d  j                  d      dk\  rd}nd}t	        |      |k\  r t        d|d| j                  |            y)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   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                 4   t        d      D ]  }t        j                           t        | j                  dd      }|rd| j
                  _        t        | j                  dd      | _        | j                         }	 | j                  |      r_| j                  ||       | j                         }| j                  j                  t        d |D                     | j                  |      r_|rt        d| j                  d	      y # t        $ r |s Y y w xY w)
Nrw   r   FTr4   r   c              3   &   K   | ]	  }|d      yw)rv   Nr   )rV   stats     r   rX   z,_RefCountChecker.__call__.<locals>.<genexpr>+  s     'CDQ'Cs   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JJL	 !0A5I15DMM.$T]]4LbQ 	_$$V,tV,++-""3'CF'C#DE $$V, $dmm%]^^ 	  	! "	s   <A/D DDN)r   r   r   rH   r2   rA   rR   rb   rn   rs   r   r5   r   r   r   r7   r7      s4    
 M	!#J>
"/b_r   r7   c                 X     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  sZ    4+U3##$JKK"76;Le+T##$NOO-f-dF;;r   )r(   SKIP_LEAKCHECKSr   )r   r   s   ` r   wrap_refcountr   3  s4    v)5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      s&  0 & 	 
 	   B JJNN+;< JJNN8,I0I jjnnZ0 !8%8zz~~&:; &T"**..9S*T**..)KL **..)KL 	^ 	 3%& %
 )HK, m_v m_^r   