o
    éT•j  ã                   @   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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 ]E\}"}#}$|"|d… }"|$|"ƒ�rxd ||"|#t"|"ƒf }%t|%tj dd� t#|d!ƒ�}&t|%|&d� |& $¡  W d  ƒ n	1 �sqw   Y  d}!�q4|!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                    ó   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$    ý "