a
    "h                      @   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
yj   d dlZdd Z	Y n0 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
   @/opt/python-3.9.21/usr/lib/python3.9/test/libregrtest/refleak.py	<genexpr>       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yl   d}Y n0 |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 ]\}"}#}$|"|d }"|$|"rnd ||"|#t"|"f }%t|%tj dd t#|d!$}&t|%|&d |&$  W d   n1 s0    Y  d}!qn|!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   r   zdash_R.<locals>.<listcomp>c                 S   s   i | ]
}||qS r
   r
   )r   valuer
   r
   r   
<dictcomp>;   r   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   |   r   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picr:   zdcabcsr   r	   r!   ZnwarmupZntrackedZfnameZrepcountZ	rep_rangeZ	rc_deltasZalloc_deltasZ	fd_deltasrD   r   rE   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    








(rT   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
yh   Y n0 |j  |j| t   fdd jjD }tt|}|D ]J}| |g D ]6}	||	t D ]}
|
 d ur|	|
  q|	  qqt  d S )Nr   c                    s   g | ]}t  j|qS r
   r   r   r   r
   r   r      r   z"dash_R_cleanup.<locals>.<listcomp>)r/   r0   r5   r6   r7   clearupdater2   r9   r:   r;   r<   _clear_type_cacher   r=   filterr   r>   getr   register_abc_caches_clearclear_caches)rM   rN   rO   rP   rQ   r/   r:   Zabs_classesr   r	   r   r
   r   r   rI      s.    




rI   c                  C   sH  t j D ]} t| dr
| `q
t jt jt jt jfD ]}|d ur2|	  q2zt jd }W n t
yh   Y n0 |j  t  zt jd }W n t
y   Y n0 |j  zt jd }W n t
y   Y n
0 |  zt jd }W n t
y   Y n
0 |  zt jd }W n t
y   Y n
0 |  zt jd }W n t
yJ   Y n
0 |  zt jd }W n t
yv   Y n0 |j  zt jd	 }	W n t
y   Y n
0 |	  zt jd
 }
W n t
y   Y n0 d |
_zt jd }W n t
y   Y n
0 |  zt jd }W n t
y&   Y n0 |jD ]}|  q.t  d S )N__warningregistry__zdistutils.dir_util	_strptimezurllib.parsezurllib.request	linecache	mimetypesfilecmpstructdoctestctypestyping)r2   modulesvaluesr1   r]   stdoutrH   
__stdout__
__stderr__r%   KeyErrorZ_path_createdrU   repurgeZ_regex_cacheclear_cache
urlcleanup
clearcacheZ_default_mime_types_cache_clearcacheZmasterZ_reset_cache	_cleanupsr   
gc_collect)modstreamZdistutils_dir_utilr^   Zurllib_parseZurllib_requestr_   r`   ra   rb   rc   rd   re   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   rR   r
   r
   r   r     r   zwarm_caches.<locals>.<listcomp>i  )bytesr?   rC   )srR   r
   r
   r   r4     s
    r4   )r@   rl   r2   r5   inspectr   testr   _abcr   r;   r   rT   rI   r\   r4   r
   r
   r
   r   <module>   s    "`