o
    f                     @   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 d dlm	Z	 d dl
mZ zd dlmZ W n eyA   d dlZdd ZY nw d	d
 Zdd Zdd ZdS )    N)
isabstract)support)	os_helper)clear_caches)	_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.10/test/libregrtest/refleak.py	<genexpr>   s    z_get_dump.<locals>.<genexpr>)set_abc_registry
_abc_cache_abc_negative_cache_abc_negative_cache_version)cls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y6   d}Y nw |j	 }i }	 fdd jjD D ]}
t|
sPqI|
 |
g D ]
}t|d |	|< qWqId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 ]E\}"}#}$|"|d }"|$|"rxd ||"|#t"|"f }%t|%tj dd t#|d!}&t|%|&d |&$  W d   n	1 sqw   Y  d}!q4|!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                       g | ]}t  j|qS r   getattrabcr
   acollectionsr   r   
<listcomp>4       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_int	beginningrepetitions)file
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
   deltar   r   r   r      s    z2dash_R.<locals>.check_rc_deltas.<locals>.<genexpr>)alldeltasr   r   r   check_rc_deltasr   s   zdash_R.<locals>.check_rc_deltasc                 S   s   t | S r   )anyr2   r   r   r   check_fd_deltas   s   zdash_R.<locals>.check_fd_deltasF
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   range
huntrleaksospathjoinr   SAVEDCWDlistgetallocatedblocksr   fd_countquietprintstderrdash_R_cleanupsumopenr,   )'ns	test_name	test_funcr8   fspspicrC   zdcabcsr   r   r%   nwarmupntrackedfnamerepcount	rep_range	rc_deltasalloc_deltas	fd_deltasrO   r   rP   	rc_beforealloc_before	fd_beforeialloc_afterrc_afterfd_afterr4   r6   failedr3   	item_namecheckermsg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
y4   Y nw |j  |j| t   fdd jjD }tt|}|D ]%}| |g D ]}	||	t D ]}
|
 d uru|	|
  qh|	  q_qVt  d S )Nr   c                    r   r   r   r   r   r   r   r      r    z"dash_R_cleanup.<locals>.<listcomp>)r8   r9   r>   r?   r@   clearupdater;   rB   rC   rD   rE   _clear_type_cacher   rF   filterr   rG   getr   register_abc_caches_clearr   )rZ   r[   r\   r]   r^   r8   rC   abs_classesr   r   r	   r   r   r   rT      s4   






rT   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
   rj   r   r   r   r      s    zwarm_caches.<locals>.<listcomp>i  )bytesrH   rN   )srj   r   r   r   r=      s
   r=   )rJ   rer;   r>   inspectr   testr   test.supportr   test.libregrtest.utilsr   _abcr   rD   r   rs   rT   r=   r   r   r   r   <module>   s$     "