U
    `                      @   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|
sq|
 |
g D ]}t|d |	|< qqd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std|dtj d td|d d  d| tj dd t!|||||	 |D ]}|  t!|||||	 | }| }| }| jst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 )"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 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|	  qqt  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    "`