U
    ¼Ê¦i   ã                   @   s’   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 zd dlm	Z	 W n$ e
k
rl   d dlZdd„ Z	Y nX dd„ Zd	d
„ Zdd„ Zdd„ ZdS )é    N)Ú
isabstract)Úsupport)Ú	_get_dumpc                 C   s&   t dd„ | jD ƒƒ}|| j| j| jfS )Nc                 s   s   | ]}t  |¡V  qd S ©N)ÚweakrefÚref)Ú.0Úobj© r
   ú./usr/lib/python3.8/test/libregrtest/refleak.pyÚ	<genexpr>   s     z_get_dump.<locals>.<genexpr>)ÚsetÚ_abc_registryÚ
_abc_cacheÚ_abc_negative_cacheÚ_abc_negative_cache_version)ÚclsZregistry_weakrefsr
   r
   r   r      s
     ÿr   c           '   
      sê  ddl }ddl‰ ttdƒs"tdƒ‚tƒ  tjdd… }|j 	¡ }tj
 	¡ }zddl}W n tk
rn   d}Y nX |j 	¡ }i }	‡ fdd„ˆ jjD ƒD ]2}
t|
ƒs¢q”|
 ¡ |
g D ]}t|ƒd |	|< q°q”dd„ td	d
ƒD ƒ‰‡fdd„}| j\}}}tj tj|¡}|| }tt|ƒƒ}dg| }dg| }dg| }tj}tj}tj}d } }}| j�s’td|dtj d� td|d d  d|… tj dd� t!|||||	ƒ |D ]„}|ƒ  t!|||||	ƒ |ƒ }|ƒ }|ƒ }| j�sìtddtj dd� ||| ƒ||< ||| ƒ||< ||| ƒ||< |}|}|}�q¦| j�s@ttj d� dd„ }dd„ } d}!|d|f|d|f|d| ffD ]t\}"}#}$|"|d… }"|$|"ƒ�rpd ||"|#t"|"ƒf }%t|%tj dd� t#|d!ƒ�}&t|%|&d� |& $¡  W 5 Q R X d}!�qp|!S )"zšRun 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 r
   ©ÚgetattrÚabc©r   Úa©Úcollectionsr
   r   Ú
<listcomp>1   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üÿÿiè  c                    s   ˆ   | | ¡S r   )Ú
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   r   |   s     z2dash_R.<locals>.check_rc_deltas.<locals>.<genexpr>)Úall©Údeltasr
   r
   r   Úcheck_rc_deltaso   s    zdash_R.<locals>.check_rc_deltasc                 S   s   t | ƒS r   )Úanyr)   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   )%ÚcopyregÚcollections.abcÚhasattrÚsysÚ	ExceptionÚwarm_cachesÚwarningsÚfiltersÚdispatch_tableÚcopyÚpath_importer_cacheÚ	zipimportÚImportErrorÚ_zip_directory_cacher   Ú__all__r   Ú__subclasses__r   ÚrangeZ
huntrleaksÚosÚpathÚjoinr   ZSAVEDCWDÚlistÚgetallocatedblocksr   Úfd_countÚquietÚprintÚstderrÚdash_R_cleanupÚsumÚopenr$   )'ÚnsZ	test_nameZ	test_funcr.   ÚfsÚpsÚpicr9   ÚzdcÚabcsr   r	   r    ZnwarmupZntrackedZfnameZrepcountZ	rep_rangeZ	rc_deltasZalloc_deltasZ	fd_deltasrC   r   rD   Z	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   s–    







ÿý
   ÿrS   c                    s  dd l }dd l‰ | tjd d …< |j ¡  |j |¡ tj ¡  tj |¡ zdd l	}W n t
k
rj   Y nX |j ¡  |j |¡ t ¡  ‡ fdd„ˆ jjD ƒ}tt|ƒ}|D ]J}| ¡ |g D ]6}	| |	tƒ ¡D ]}
|
ƒ d k	rÒ|	 |
ƒ ¡ qÒ|	 ¡  qÀq®tƒ  d S )Nr   c                    s   g | ]}t ˆ j|ƒ‘qS r
   r   r   r   r
   r   r   ª   s     z"dash_R_cleanup.<locals>.<listcomp>)r.   r/   r4   r5   r6   ÚclearÚupdater1   r8   r9   r:   r;   Ú_clear_type_cacher   r<   Úfilterr   r=   Úgetr   ÚregisterÚ_abc_caches_clearÚclear_caches)rL   rM   rN   rO   rP   r.   r9   Zabs_classesr   r	   r   r
   r   r   rH   ”   s.    




rH   c                  C   s^  t j ¡ D ]} t| dƒr
| `q
t jt jt jt jfD ]}|d k	r2| 	¡  q2zt jd }W n t
k
rj   Y nX |j ¡  t ¡  zt jd }W n t
k
r    Y nX |j ¡  zt jd }W n t
k
rÎ   Y n
X | ¡  zt jd }W n t
k
rú   Y n
X | ¡  zt jd }W n t
k
�r(   Y n
X | ¡  zt jd }W n t
k
�rV   Y n
X | ¡  zt jd }W n t
k
�r„   Y nX |j ¡  zt jd	 }	W n t
k
�r´   Y n
X |	 ¡  zt jd
 }
W n t
k
�râ   Y nX d |
_zt jd }W n t
k
�r   Y n
X | ¡  zt jd }W n t
k
�r<   Y nX |jD ]}|ƒ  �qDt ¡  d S )NÚ__warningregistry__zdistutils.dir_utilÚ	_strptimezurllib.parsezurllib.requestÚ	linecacheÚ	mimetypesÚfilecmpÚstructÚdoctestÚctypesÚtyping)r1   ÚmodulesÚvaluesr0   r\   ÚstdoutrG   Ú
__stdout__Ú
__stderr__r$   ÚKeyErrorZ_path_createdrT   ÚreÚpurgeZ_regex_cacheZclear_cacheZ
urlcleanupÚ
clearcacheZ_default_mime_typesÚ_cacheZ_clearcacheZmasterZ_reset_cacheZ	_cleanupsr   Z
gc_collect)ÚmodÚstreamZdistutils_dir_utilr]   Zurllib_parseZurllib_requestr^   r_   r`   ra   rb   rc   rd   Úfr
   r
   r   r[   ¶   s€    






r[   c                  C   sN   t tdƒƒ} tdƒD ]}| ||d …  qdd„ tdƒD ƒ ttddƒƒ d S )Né   r#   c                 S   s   g | ]}t |ƒ‘qS r
   )Úchr)r   rQ   r
   r
   r   r     s     zwarm_caches.<locals>.<listcomp>éûÿÿÿi  )Úbytesr>   rB   )ÚsrQ   r
   r
   r   r3     s
    r3   )r?   rk   r1   r4   Úinspectr   Ztestr   Ú_abcr   r:   r   rS   rH   r[   r3   r
   r
   r
   r   Ú<module>   s    "`