B
    H/\e                 @   st   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d dl	Z	d dl
Z	dd ZG dd deZdd	 ZdS )
    )print_functionN)wrapsc             C   s
   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)func r   7lib/python3.7/site-packages/gevent/testing/leakcheck.pyignores_leakcheck"   s    r   c               @   s   e Zd ZeeejejfZye	j
jZW n  ek
rD   ddlmZ Y nX dd Zdd Zdd Zd	d
 Zdd Zdd Zdd Zdd ZdS )_RefCountCheckerr   )callbackc             C   s"   || _ || _g | _i | _d| _d S )NF)testcasefunctiondeltas
peak_statsneeds_setUp)selfr   r   r   r   r   __init__<   s
    z_RefCountChecker.__init__c             C   s`   || ks || j  ks || jkr$dS t|}|| jkr:dS || jkr\|jd kr\|jd kr\dS dS )NFT)__dict__values_ignore_object_ptypeIGNORED_TYPESCALLBACK_KINDr
   args)r   objZkindr   r   r   r   F   s    

z!_RefCountChecker._ignore_object_pc             C   s   t jd | j| jdS )N)limitr   filter)objgraphgrowthr   r   )r   r   r   r   _growthY   s    z_RefCountChecker._growthc             C   sV   |sdS g }t dd |D }x(|D ] \}}}|d||||f  q$W d|}|S )Nz<Unable to calculate growth>c             s   s   | ]\}}}t |V  qd S )N)len).0name_r   r   r   	<genexpr>a   s    z0_RefCountChecker._report_diff.<locals>.<genexpr>z%-*s%9d %+9d
)maxappendjoin)r   r   lineswidthr!   countZdeltadiffr   r   r   _report_diff\   s    
z_RefCountChecker._report_diffc             C   sl   t  }t   | jr(| j  d| j_z| j| jf|| W d | j  d| j_d| _|rft 	  X d S )NFT)
gc	isenableddisabler   r   ZsetUpZskipTearDownr   ZtearDownenable)r   r   kwargsZ
gc_enabledr   r   r   	_run_testi   s    

z_RefCountChecker._run_testc             C   s8   dt jkrt jd   dt jkr0t jd   |  S )NZurlparsezurllib.parse)sysmodulesZclear_cacher   )r   r   r   r   _growth_aftery   s
    

z_RefCountChecker._growth_afterc             C   sN  | j }|sdS tjr$tdtjf |dd  ddgkrHt|dkrHdS |dd  dddgkrbdS t|dkrt|d	d  dkrdS t|d
kr|d dkr|d |d kr|d |d kr| |}td||f t|dd  dkst|d	d  dks|d	d  ddkr"d}nd}t||krJtd|| |f dS )NTz"Generated uncollectable garbage %rr   )      F   r8   zrefcount increased by %r
%sr7         )r   r-   ZgarbageAssertionErrorr   sumr,   r*   )r   r   r   r+   r   r   r   r   _check_deltas   s,      8
Dz_RefCountChecker._check_deltasc             C   sd   xt dD ]}t  q
W |  }x<| |r^| || |  }| jt	dd |D  q$W d S )Nr8   c             s   s   | ]}|d  V  qdS )r7   Nr   )r    statr   r   r   r#      s    z,_RefCountChecker.__call__.<locals>.<genexpr>)
ranger-   Zcollectr   rA   r2   r5   r   r&   r@   )r   r   r1   r"   r   r   r   r   __call__   s    z_RefCountChecker.__call__N)__name__
__module____qualname__tupledicttypes	FrameTypeTracebackTyper   geventZcorer
   r   AttributeErrorZgevent._ffi.callbackr   r   r   r,   r2   r5   rA   rD   r   r   r   r   r	   1   s   
	1r	   c                s(   t  ddr S t  fdd}|S )Nr   Fc                s&   t | ddrtdt|  ||S )Nr   Fz$This class ignored during leakchecks)getattrunittestZSkipTestr	   )r   r   r1   )methodr   r   wrapper   s    
zwrap_refcount.<locals>.wrapper)rO   r   )rQ   rR   r   )rQ   r   wrap_refcount   s    rS   )Z
__future__r   r3   r-   rJ   	functoolsr   rP   r   rM   Zgevent.corer   objectr	   rS   r   r   r   r   <module>   s    