o *g@sddlZddlZddlZddlZddlmZddlmZddlm Z ddl m Z zddl m Z WneyAddlZddZ Ynwd d Zd d Zd dZdS)N) isabstract)support) os_helper) clear_caches) _get_dumpcCs&tdd|jD}||j|j|jfS)Ncss|]}t|VqdSN)weakrefref).0objr //usr/lib/python3.10/test/libregrtest/refleak.py sz_get_dump..)set _abc_registry _abc_cache_abc_negative_cache_abc_negative_cache_version)clsregistry_weakrefsr r r rsrc' sddl}ddlttdstdttjdd}|j }tj }zddl }Wn t y6d}Ynw|j }i} fddjjDD]} t| sPqI| | gD] } t| d| | <qWqIddtd d Dfd d } |j\} }}tjtj|}| |}tt|}dg|}dg|}dg|}tj}tj}tj}d}}}|jstd |dtj dtd|ddd|tj ddt!||||| |D]@}|t!||||| |}|}|}|jstddtj dd| ||||<| ||||<| ||||<|}|}|}q|jsttj ddd}dd} d}!|d|f|d|f|d| ffD]E\}"}#}$|"| d}"|$|"rxd ||"|#t"|"f}%t|%tj ddt#|d!}&t|%|&d|&$Wdn 1sqwYd}!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. rNgettotalrefcountz9Tracking reference leaks requires a debug build of Pythoncg|]}tj|qSr getattrabcr a collectionsr r 4zdash_R..cSsi|]}||qSr r )r valuer r r >szdash_R..iics ||Sr) setdefault)r!)int_poolr r get_pooled_int?s zdash_R..get_pooled_int beginning repetitions)file 1234567890 T)r(flush.)endr(r,cSstdd|DS)Ncss|]}|dkVqdS)r+Nr )r deltar r r rsz2dash_R..check_rc_deltas..)alldeltasr r r check_rc_deltasrs zdash_R..check_rc_deltascSst|Sr)anyr2r r r check_fd_deltasszdash_R..check_fd_deltasF referencesz memory blockszfile descriptorsz%s leaked %s %s, sum=%sr)%copyregcollections.abchasattrsys Exception warm_cacheswarningsfiltersdispatch_tablecopypath_importer_cache zipimport ImportError_zip_directory_cacher__all__r__subclasses__rrange huntrleaksospathjoinrSAVEDCWDlistgetallocatedblocksrfd_countquietprintstderrdash_R_cleanupsumopenr,)'ns test_name test_funcr8fspspicrCzdcabcsrr r%nwarmupntrackedfnamerepcount rep_range rc_deltas alloc_deltas fd_deltasrOrrP rc_before alloc_before fd_beforei alloc_afterrc_afterfd_afterr4r6failedr3 item_namecheckermsgrefrepr )rr$r dash_Rs                    rsc sddl}ddl|tjdd<|j|j|tjtj|zddl }Wn t y4Yn w|j |j |t fddj jD}tt|}|D]%}||gD]} || tD] } | duru| | qh| q_qVtdS)Nrcrr rrrr r rr z"dash_R_cleanup..)r8r9r>r?r@clearupdater;rBrCrDrE_clear_type_cacherrFfilterrrGgetrregister_abc_caches_clearr) rZr[r\r]r^r8rC abs_classesrr r r rr rTs4             rTcCsNttd}tdD] }|||dq ddtdDttdddS)Nr+cSsg|]}t|qSr )chr)r rjr r r rszwarm_caches..i)bytesrHrN)srjr r r r=s  r=)rJrer;r>inspectrtestr test.supportrtest.libregrtest.utilsr_abcrrDrrsrTr=r r r r s$        "