3
^dP                 @   sd   d dl Z 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 Z	dd Z
dd	 Zd
d ZdS )    N)
isabstract)supportc       $         s  ddl }ddl ttds"tdtjdd }|jj }tj	j }yddl
}W n tk
rh   d}	Y nX |jj }	i }
xN fdd jjD D ]4}t|sqx$|j |g D ]}|jj |
|< qW qW dd td!d	D fd
d}|\}}}tjjtj|}|| }dg| }dg| }dg| }td|dtjd td|d d  d| tjdd d } }}xt|D ]z}|  t||||	|
\}}}tddtjdd ||kr||| ||< ||| ||< ||| ||< |}|}|}qtW ttjd dd }dd }d}x|d|f|d|f|d|fgD ]t\}} }!||d }|!|r0d||| t|f }"t|"tjdd t|d }#t|"|#d |#j  W dQ R X d}q0W |S )"zRun a test multiple times, looking for reference leaks.

    Returns:
        False if the test didn't leak references; True if we detected refleaks.
    r   Ngettotalrefcountz9Tracking reference leaks requires a debug build of Pythonc                s   g | ]}t  j|qS  )getattrabc).0a)collectionsr   ./usr/lib/python3.6/test/libregrtest/refleak.py
<listcomp>#   s    zdash_R.<locals>.<listcomp>c             S   s   i | ]
}||qS r   r   )r   valuer   r   r   
<dictcomp>-   s    zdash_R.<locals>.<dictcomp>i  c                s    j | | S )N)
setdefault)r   )int_poolr   r   get_pooled_int.   s    zdash_R.<locals>.get_pooled_intZ	beginningZrepetitions)fileZ
1234567890
      T)r   flush. )endr   r   c             S   s   t dd | D S )Nc             s   s   | ]}|d kV  qdS )r   Nr   )r   Zdeltar   r   r   	<genexpr>Y   s    z2dash_R.<locals>.check_rc_deltas.<locals>.<genexpr>)all)deltasr   r   r   check_rc_deltasL   s    zdash_R.<locals>.check_rc_deltasc             S   s   t | S )N)any)r   r   r   r   check_fd_deltas[   s    zdash_R.<locals>.check_fd_deltasFZ
referenceszmemory blockszfile descriptorsz%s leaked %s %s, sum=%sr	   i)copyregcollections.abchasattrsys	Exceptionwarningsfiltersdispatch_tablecopypath_importer_cache	zipimportImportError_zip_directory_cacher   __all__r   __subclasses___abc_registryrangeospathjoinr   ZSAVEDCWDprintstderrdash_R_cleanupsumopenr   )$Z
the_moduletestZindirect_testZ
huntrleaksr   fspspicr)   zdcabcsr   objr   ZnwarmupZntrackedZfnameZrepcountZ	rc_deltasZalloc_deltasZ	fd_deltasZ	rc_beforeZalloc_beforeZ	fd_beforeiZalloc_afterZrc_afterZfd_afterr   r   Zfailedr   Z	item_nameZcheckermsgZrefrepr   )r
   r   r   dash_R
   sx    













rA   c                sf  dd l }dd l}dd l ddlm} | tjd d < |jj  |jj	| t
jj  t
jj	| ydd l}W n tk
r~   Y nX |jj  |jj	| t
j   fdd jjD }	tt|	}	dt
jkrt
jd }
t|	|
j|
j|
jg }	xN|	D ]F}x@|j |g D ].}|j|| j |_|jj  |jj  qW qW t  t
j }t
j!}|j"  | | t#j$ fS )Nr   )WeakSetc                s   g | ]}t  j|qS r   )r   r   )r   r	   )r
   r   r   r      s    z"dash_R_cleanup.<locals>.<listcomp>typing)%gcr   r    weakrefrB   r$   r%   r&   clearupdater"   r(   r)   r*   r+   _clear_type_cacher   r,   filterr   moduleslistChainMapCounterZDefaultDictr-   getr'   r.   
_abc_cache_abc_negative_cacheclear_cachesgetallocatedblocksr   collectr   Zfd_count)r9   r:   r;   r<   r=   rD   r   rB   r)   Zabs_classestr   r>   Zfunc1Zfunc2r   )r
   r   r5   q   s<    







r5   c           [   C   st  dd l } x tjj D ]}t|dr|`qW x,tjtjtjtj	fD ]}|d k	r@|j
  q@W ytjd }W n tk
rz   Y nX |jj  tj  ytjd }W n tk
r   Y nX |jj  ytjd }W n tk
r   Y n
X |j  ytjd }W n tk
r   Y n
X |j  ytjd }W n tk
r:   Y n
X |j  ytjd }W n tk
rh   Y n
X |j  ytjd	 }	W n tk
r   Y nX |	jj  ytjd
 }
W n tk
r   Y n
X |
j  ytjd }W n tk
r   Y nX d |_ytjd }W n tk
r    Y n
X |j  ytjd }W n tk
rN   Y nX x|jD ]}|  qXW | j  d S )Nr   __warningregistry__zdistutils.dir_util	_strptimezurllib.parsezurllib.request	linecache	mimetypesfilecmpstructdoctestctypesrC   )rD   r"   rJ   valuesr!   rU   stdoutr4   
__stdout__
__stderr__r   KeyErrorZ_path_createdrF   repurgeZ_regex_cacheZclear_cacheZ
urlcleanup
clearcacheZ_default_mime_types_cacheZ_clearcacheZmasterZ_reset_cacheZ	_cleanupsrS   )rD   modstreamZdistutils_dir_utilrV   Zurllib_parseZurllib_requestrW   rX   rY   rZ   r[   r\   rC   fr   r   r   rQ      s    



rQ   c              C   sR   t td} x tdD ]}| ||d   qW dd tdD  ttdd d S )N   r   c             S   s   g | ]}t |qS r   )chr)r   r?   r   r   r   r     s    zwarm_caches.<locals>.<listcomp>   i  )bytesr/   rK   )sr?   r   r   r   warm_caches   s
    ro   )errnor0   rb   r"   r$   inspectr   r8   r   rA   r5   rQ   ro   r   r   r   r   <module>   s   g-b