
    Rh=                         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	 ddl
mZ ddlmZ 	 d d	lmZ dedefdZd Zd Zy# e$ r
 d dlZd
 ZY w xY w)    N)
isabstract)Any)support)	os_helper   )HuntRefleak)clear_caches)	_get_dumpc                     t        d | j                  D              }|| j                  | j                  | j                  fS )Nc              3   F   K   | ]  }t        j                  |        y wN)weakrefref).0objs     //usr/lib/python3.12/test/libregrtest/refleak.py	<genexpr>z_get_dump.<locals>.<genexpr>   s     NSC 0Ns   !)set_abc_registry
_abc_cache_abc_negative_cache_abc_negative_cache_version)clsregistry_weakrefss     r   r
   r
      sA      NC<M<MNN!3>>'')H)HJ 	J    hunt_refleakquietc           
        4 ddl }ddl}t        t        d      st	        d      t                t        j                  dd }|j                  j                         }t        j                  j                         }	 ddl}	|	j                  j                         }
i }|j                  j                  D cg c]  }t!        |j                  |       c}D ]8  }t#        |      s|j%                         |gz   D ]  }t'        |      d   ||<    : t)        dd      D ci c]  }|| c}44fd}|j*                  }|j,                  }|j.                  }||z   }t1        t)        |            }dg|z  }dg|z  }dg|z  }t        j2                  }t        j4                  }t        j6                  }t8        j:                  }dx}x}x}} |sUt=        d|d	t        j>                  
       d|dz  dz   z  d| }!|!d| dz   |!|d z   }!t=        |!t        j>                  d       d}"tA        ||||
|       tC        jD                          |D ]  }# |       }"tA        ||||
|       tC        jD                           |       }$ |       |$z
  }% |       |$dz  z
  }& |       }' ||&|z
        ||#<    ||%|z
        ||#<    ||'|z
        ||#<   |sltG        ||#   ||#   ||#         }(|(dk  rd})n|(dk  rd|(   })nd})|#|k(  rt=        ddt        j>                  d       t=        |)dt        j>                  d       ~(~)|%}|&}|'}|$}  |st=        t        j>                  
       d }*d }+d},|d|*f|d|*f|d|+ffD ]  \  }-}.}/|-|d }- |/|-      }0tI        |-      }1|0s|1s$| d|-d|.dtK        |-      }2t=        |2dt        j>                          |0rRt=        t        j>                  d       tM        |d!d"#      5 }3t=        |2|3
       |3jO                          ddd       d},t=        d$t        j>                  d        |,|"fS # t        $ r d}
Y w xY wc c}w c c}w # 1 sw Y   JxY w)%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 Pythonii  c                 (    j                  | |       S r   )
setdefault)valueint_pools    r   get_pooled_intz'runtest_refleak.<locals>.get_pooled_intE   s    ""5%00r   	beginningzHrepetitions. Showing number of leaks (. for 0 or less, X for 10 or more))file
1234567890
   r   :T)r&   flush   .)
r,   123456789X  )endr&   r*   c                 &    t        d | D              S )Nc              3   &   K   | ]	  }|d k\    yw)r   N )r   deltas     r   r   z;runtest_refleak.<locals>.check_rc_deltas.<locals>.<genexpr>   s     2%5A:2s   )alldeltass    r   check_rc_deltasz(runtest_refleak.<locals>.check_rc_deltas   s     26222r   c                     t        |       S r   )anyr?   s    r   check_fd_deltasz(runtest_refleak.<locals>.check_fd_deltas   s    6{r   F
referenceszmemory blockszfile descriptorsz leaked z, sum=)r9   r&   azutf-8)encodingz (this is fine))(copyregcollections.abchasattrsys	Exceptionwarm_cacheswarningsfiltersdispatch_tablecopypath_importer_cache	zipimport_zip_directory_cacheImportErrorabc__all__getattrr   __subclasses__r
   rangewarmupsrunsfilenamelistgetallocatedblocksr   getunicodeinternedsizer   fd_countprintstderrdash_R_cleanupr   
gc_collectmaxrC   sumopenr*   )5	test_name	test_funcr   r   rH   collectionsfspspicrS   zdcabcsrF   rV   r   r"   r$   r[   r\   r]   repcount	rep_range	rc_deltasalloc_deltas	fd_deltasr_   r   r`   ra   	rc_beforealloc_before	fd_beforeinterned_beforenumbersresultsiinterned_afteralloc_afterrc_afterfd_aftertotal_leakssymbolrA   rD   failedr@   	item_namecheckerfailing
suspiciousmsgrefrepr#   s5                                                       @r   runtest_refleakr      s    3*+ $ % 	%
 M 
		!	B				$	$	&B

!
!
&
&
(C4
 ,,113D5@__5L5LM+M *#%%'3%/ 	*C!#q)DI	** +0t*<=u=H1 ""GD$$H~H U8_%IhI3>LhI//++ 77!!H=>>I>>y?k8 &6::	  2!12IX>(7#c)GGH,==gCJJd3G2r3T* ')+r2sC. 01(*^;#%(:::%h&:;	!(|)CDQ%h&:;	!ilLOYq\JKar!!# G|cr

$?&bszz>"		(O')R 3::3 F	L/2	8	&8' F"	7 !&/[
j69c&k;C#2CJJ/3::T2(C': #f#F+LLN# 'cjjE)F* GM   N >`# #s*   ;P5 3Q
Q*Q5QQQ	c                 ^   dd l }dd l}| t        j                  d d  |j                  j                          |j                  j                  |       t        j                  j                          t        j                  j                  |       	 dd l	}|j                  j                          |j                  j                  |       |j                  j                  D cg c]  }t        |j                  |       }	}t        t         |	      }	|	D ]h  }
|
j#                         |
gz   D ]O  }|j%                  |t'                     D ]   } |       |j)                   |              " |j+                          Q j t-                t        j.                          y # t        $ r Y w xY wc c}w )Nr   )rH   rI   rN   rO   rP   clearupdaterK   rR   rS   rT   rU   rV   rW   rX   filterr   rY   getr   register_abc_caches_clearr	   _clear_type_cache)rl   rm   rn   ro   rp   rH   rk   rS   rF   abs_classesrV   r   r   s                r   rd   rd      si    HQ  "!!"%!!#""3'3 	&&,,.&&--c2 9D8O8OP17;??A.PKP[1K $%%'3%/ 	$CxxSU+ (5$LL'( !!#		$$ N +   Qs   F  F*	F'&F'c                      t        t        d            } t        d      D ]
  }| ||dz      t        d      D cg c]  }t        |       c} t        t        dd             y c c}w )N   r   i  )bytesrZ   chrr^   )sr|   s     r   rM   rM      s[    eCjA3Z 	!AaC 3Z SV r3 !s   A%)rK   rN   inspectr   typingr   testr   test.supportr   runtestsr   utilsr	   _abcr
   rU   r   boolr   rd   rM   r<   r   r   <module>r      sg    
     " ! 
Ja"-aaH!Hg  JJJs   A AA