o
    HXîh©·  ã                   @   s¾  d dl Z d dlZ d dlmZmZmZ d dlmZ d dlm	Z	m
Z
mZ d dlmZmZ d dlmZ d dlZd dlZd dlZd dlZd dlZd dlZd dlZzd dlmZ W n eya   dd	„ ZY nw zd d
lmZ W n eyu   dZY nw G dd„ deƒZG dd„ deƒZeG dd„ deƒƒZe ¡   dd¡r¡de ¡ d v Z!ne"edƒ Z!G dd„ de j#ƒZ$G dd„ de j#ƒZ%G dd„ de j#ƒZ&G dd„ de j#ƒZ'dd„ Z(dd „ Z)e*d!krÝe  +¡  dS dS )"é    N)ÚverboseÚrefcount_testÚcpython_only)Úimport_module)Útemp_dirÚTESTFNÚunlink)Úassert_python_okÚmake_script)Úthreading_helper)Úwith_tp_delc                 C   s   G dd„ dt ƒ}|S )Nc                   @   ó   e Zd Zdd„ ZdS )zwith_tp_del.<locals>.Cc                 _   s   t dƒ‚)Nzrequires _testcapi.with_tp_del)Ú	TypeError)ÚclsÚargsÚkwargs© r   ú6/opt/python-3.10.19/usr/lib/python3.10/test/test_gc.pyÚ__new__   s   zwith_tp_del.<locals>.C.__new__N)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   ÚC   ó    r   )Úobject)r   r   r   r   r   r      s   r   )ÚContainerNoGCc                   @   r   )ÚC1055820c                 C   s   || _ | | _d S ©N)ÚiÚloop)Úselfr   r   r   r   Ú__init__)   s   
zC1055820.__init__N©r   r   r   r!   r   r   r   r   r   (   r   r   c                   @   r   )ÚGC_Detectorc                    s(   dˆ _ ‡ fdd„}t tdƒ|¡ˆ _d S )NFc                    s
   dˆ _ d S )NT)Úgc_happened©Zignored©r    r   r   Úit_happened4   ó   
z)GC_Detector.__init__.<locals>.it_happenedéš  )r$   ÚweakrefÚrefr   Úwr)r    r'   r   r&   r   r!   1   s   zGC_Detector.__init__Nr"   r   r   r   r   r#   -   s    r#   c                   @   s"   e Zd ZdZddd„Zdd„ ZdS )ÚUncollectablea)  Create a reference cycle with multiple __del__ methods.

    An object in a reference cycle will never have zero references,
    and so must be garbage collected.  If one or more objects in the
    cycle have __del__ methods, the gc refuses to guess an order,
    and leaves the cycle uncollected.Nc                 C   s"   |d u rt | d| _d S || _d S )N)Úpartner)r-   r.   )r    r.   r   r   r   r!   C   s   
zUncollectable.__init__c                 C   ó   d S r   r   r&   r   r   r   Ú
__tp_del__H   s   zUncollectable.__tp_del__r   )r   r   r   Ú__doc__r!   r0   r   r   r   r   r-   ;   s    
r-   Z	PY_CFLAGSÚ z-DNDEBUGZgettotalrefcountc                   @   st  e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
edd„ ƒZedd„ ƒZdd„ Zedd„ ƒZdd„ Zdd„ Zdd„ Zedd „ ƒZed!d"„ ƒZd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7d8„ Z ed9d:„ ƒZ!d;d<„ Z"d=d>„ Z#d?d@„ Z$dAdB„ Z%dCdD„ Z&dEdF„ Z'dGdH„ Z(dIdJ„ Z)dKdL„ Z*dMdN„ Z+e, -e.dOu dP¡dQdR„ ƒZ/dOS )SÚGCTestsc                 C   s,   g }|  |¡ t ¡  ~|  t ¡ d¡ d S ©Né   ©ÚappendÚgcÚcollectÚassertEqual)r    Úlr   r   r   Ú	test_listW   s
   
zGCTests.test_listc                 C   s*   i }||d< t  ¡  ~|  t  ¡ d¡ d S r4   ©r8   r9   r:   ©r    Údr   r   r   Ú	test_dict^   s
   zGCTests.test_dictc                 C   s4   g }|f}|  |¡ t ¡  ~~|  t ¡ d¡ d S )Né   r6   )r    r;   Útr   r   r   Ú
test_tuplee   s   
zGCTests.test_tuplec                 C   s2   G dd„ dƒ}||_ t ¡  ~|  t ¡ d¡ d S )Nc                   @   ó   e Zd ZdS )zGCTests.test_class.<locals>.AN©r   r   r   r   r   r   r   ÚAp   ó    rF   r   ©Úar8   r9   ÚassertNotEqual©r    rF   r   r   r   Ú
test_classo   s
   zGCTests.test_classc                 C   s.   G dd„ dt ƒ}t ¡  ~|  t ¡ d¡ d S )Nc                   @   rD   )z%GCTests.test_newstyleclass.<locals>.ANrE   r   r   r   r   rF   x   rG   rF   r   )r   r8   r9   rJ   rK   r   r   r   Útest_newstyleclassw   s   zGCTests.test_newstyleclassc                 C   s8   G dd„ dƒ}|ƒ }||_ t ¡  ~|  t ¡ d¡ d S )Nc                   @   rD   )z GCTests.test_instance.<locals>.ANrE   r   r   r   r   rF      rG   rF   r   rH   ©r    rF   rI   r   r   r   Útest_instance~   s   zGCTests.test_instancec                 C   sÀ   G dd„ dt ƒ}|ƒ }||_t ¡  ~|  t ¡ d¡ G dd„ dtƒ}G dd„ d||ƒ}|ƒ }||_t ¡  ~|  t ¡ d¡ ~~|  t ¡ d¡ |ƒ |_~|  t ¡ d¡ |  t ¡ d¡ d S )Nc                   @   rD   )z#GCTests.test_newinstance.<locals>.ANrE   r   r   r   r   rF   ˆ   rG   rF   r   c                   @   rD   )z#GCTests.test_newinstance.<locals>.BNrE   r   r   r   r   ÚB   rG   rP   c                   @   rD   )z#GCTests.test_newinstance.<locals>.CNrE   r   r   r   r   r   ‘   rG   r   )r   rI   r8   r9   rJ   Úlistr:   )r    rF   rI   rP   r   r   r   r   Útest_newinstance‡   s&   zGCTests.test_newinstancec                 C   s2   G dd„ dƒ}|ƒ }t  ¡  ~|  t  ¡ d¡ d S )Nc                   @   r   )zGCTests.test_method.<locals>.Ac                 S   s   | j | _d S r   )r!   Zinitr&   r   r   r   r!   ¢   ó   z'GCTests.test_method.<locals>.A.__init__Nr"   r   r   r   r   rF   ¡   r   rF   r   )r8   r9   rJ   rN   r   r   r   Útest_methodŸ   s
   zGCTests.test_methodc                 C   s–   t G dd„ dƒƒ}G dd„ dƒ}|ƒ }||_t|ƒ}|ƒ }||_t ¡  ~~|  t ¡ d¡ tjD ]}t|ƒ|kr=|` nq1|  d¡ tj 	|¡ d S )Nc                   @   r   )z(GCTests.test_legacy_finalizer.<locals>.Ac                 S   r/   r   r   r&   r   r   r   r0   ¯   ó    z3GCTests.test_legacy_finalizer.<locals>.A.__tp_del__N©r   r   r   r0   r   r   r   r   rF   ­   ó    rF   c                   @   rD   )z(GCTests.test_legacy_finalizer.<locals>.BNrE   r   r   r   r   rP   °   rG   rP   r   ú&didn't find obj in garbage (finalizer))
r   rI   ÚidÚbr8   r9   rJ   ÚgarbageÚfailÚremove©r    rF   rP   rI   Zid_arZ   Úobjr   r   r   Útest_legacy_finalizer©   s&   
þ
zGCTests.test_legacy_finalizerc                 C   sš   t G dd„ dtƒƒ}G dd„ dtƒ}|ƒ }||_t|ƒ}|ƒ }||_t ¡  ~~|  t ¡ d¡ tjD ]}t|ƒ|kr?|` nq3|  	d¡ tj 
|¡ d S )Nc                   @   r   )z1GCTests.test_legacy_finalizer_newclass.<locals>.Ac                 S   r/   r   r   r&   r   r   r   r0   É   rU   z<GCTests.test_legacy_finalizer_newclass.<locals>.A.__tp_del__NrV   r   r   r   r   rF   Ç   rW   rF   c                   @   rD   )z1GCTests.test_legacy_finalizer_newclass.<locals>.BNrE   r   r   r   r   rP   Ê   rG   rP   r   rX   )r   r   rI   rY   rZ   r8   r9   rJ   r[   r\   r]   r^   r   r   r   Útest_legacy_finalizer_newclassÃ   s&   
þ
z&GCTests.test_legacy_finalizer_newclassc                 C   s,   i }t d|ƒ t ¡  ~|  t ¡ d¡ d S )Nzdef f(): pass
rA   )Úexecr8   r9   r:   r>   r   r   r   Útest_functionÝ   s
   
zGCTests.test_functionc                 C   s*   dd„ }t  ¡  |ƒ  |  t  ¡ d¡ d S )Nc                  S   s   t  ¡ } d S r   )ÚsysÚ	_getframe)Úframer   r   r   Úfè   rS   zGCTests.test_frame.<locals>.fr5   r=   )r    rg   r   r   r   Ú
test_frameæ   s   zGCTests.test_framec                 C   sˆ   t  ¡  |  t jg ¡ g }| |¡ t|ƒ}t  ¡ }t  |t jB ¡ ~t  ¡  t  |¡ |  t	t jƒd¡ t j 
¡ }|  t|ƒ|¡ d S r4   )r8   r9   r:   r[   r7   rY   Ú	get_debugÚ	set_debugZDEBUG_SAVEALLÚlenÚpop)r    ÚLZid_LÚdebugr_   r   r   r   Útest_saveallî   s   


zGCTests.test_saveallc                 C   sF   t  ¡ }t  ¡  t  d¡ G dd„ dƒ}|ƒ }~t  ¡  t j|Ž  d S )Nr5   c                   @   r   )zGCTests.test_del.<locals>.Ac                 S   ó   t | ƒ d S r   ©Údirr&   r   r   r   Ú__del__  rS   z#GCTests.test_del.<locals>.A.__del__N©r   r   r   rs   r   r   r   r   rF     r   rF   )r8   Úget_thresholdÚenableÚset_thresholdÚdisable©r    Z
thresholdsrF   rI   r   r   r   Útest_del  s   
zGCTests.test_delc                 C   sH   t  ¡ }t  ¡  t  d¡ G dd„ dtƒ}|ƒ }~t  ¡  t j|Ž  d S )Nr5   c                   @   r   )z$GCTests.test_del_newclass.<locals>.Ac                 S   rp   r   rq   r&   r   r   r   rs     rS   z,GCTests.test_del_newclass.<locals>.A.__del__Nrt   r   r   r   r   rF     r   rF   )r8   ru   rv   rw   r   rx   ry   r   r   r   Útest_del_newclass  s   
zGCTests.test_del_newclassc                 C   sd   t  ¡  t  ¡ \}}}g }t  ¡ \}}}|  ||fd¡ |  ||fd¡ |  |d¡ |  ||¡ d S )N©r   r   é   )r8   r9   Ú	get_countr:   Z
assertLessÚassertGreater)r    rI   rZ   ÚcÚxr?   Úerg   r   r   r   Útest_get_count*  s   zGCTests.test_get_countc                 C   sˆ   t  ¡  g }t  d¡ t  ¡ \}}}t  d¡ t  ¡ \}}}t  d¡ t  ¡ \}}	}
|  ||fd¡ |  ||fd¡ |  |	|
fd¡ d S )Nr   r5   rA   )r5   r   )r   r5   r|   )r8   r9   r~   r:   )r    r   rI   rZ   r€   r?   r‚   rg   ÚgÚhr   r   r   r   Útest_collect_generations8  s   


z GCTests.test_collect_generationsc                    sŽ   G ‡ fdd„dƒ‰ t  ¡  d}tdƒD ]-}g }t|ƒD ]}|ˆ ƒ g}qg }t|ƒD ]}|ˆ ƒ g}q)i }t|ƒD ]}|ˆ ƒ dœ}q7qt  ¡  d S )Nc                       s   e Zd ZdZ‡ fdd„ZdS )z#GCTests.test_trashcan.<locals>.Ouchr   c                    s*   ˆ j d ˆ _ ˆ j d dkrt ¡  d S d S )Nr5   é   r   )Únr8   r9   r&   ©ÚOuchr   r   rs   P  s   ÿz+GCTests.test_trashcan.<locals>.Ouch.__del__N)r   r   r   rˆ   rs   r   r‰   r   r   rŠ   N  s    rŠ   é–   rA   )r5   rA   )r8   rv   Úrangerx   )r    ÚNÚcountrB   r   ÚuÚvr   r‰   r   Útest_trashcanM  s   ÿzGCTests.test_trashcanc              	      sþ   d‰d}dd„ ‰G ‡ ‡fdd„dt ƒ‰ ‡ ‡fdd„‰‡‡fd	d
„}t ¡ }t d¡ z<g ‰g }t|ƒD ]}tj|d}| |¡ q3t 	|‡fdd„¡ t
 d¡ W d   ƒ n1 s[w   Y  W t |¡ nt |¡ w t ¡  |  tˆ jƒtˆ jƒ¡ d S )Né<   rA   c                	   s   s&    zdV  W t  d¡ dS t  d¡ w )z<A generator that releases the GIL when closed or dealloc'ed.Ngíµ ÷Æ°>)ÚtimeÚsleepr   r   r   r   Úsleeper_genu  s   €z2GCTests.test_trashcan_threads.<locals>.sleeper_genc                       s.   e Zd Zg Zg Z‡ fdd„Z‡ ‡fdd„ZdS )z(GCTests.test_trashcan_threads.<locals>.Cc                    s   || d d …< ˆ j  d ¡ d S r   )Úinitsr7   )r    Úalist)r   r   r   r!   €  ó   z1GCTests.test_trashcan_threads.<locals>.C.__init__c                    s   ˆ j  d ¡ ˆƒ }t|ƒ d S r   )Údelsr7   Únext)r    r„   ©r   r•   r   r   rs   ƒ  s   z0GCTests.test_trashcan_threads.<locals>.C.__del__N)r   r   r   r–   r™   r!   rs   r   r›   r   r   r   |  s
    r   c                     s(   ˆ g ƒ} t ˆƒD ]}ˆ | gƒg} q~ dS )zyCreate a sufficiently nested container object so that the
            trashcan mechanism is invoked when deallocating it.N)rŒ   )r   r   )r   ÚNESTINGr   r   Úmake_nestedŽ  s   z2GCTests.test_trashcan_threads.<locals>.make_nestedc                      s   ˆ s	ˆƒ  ˆ rdS dS )z!Exercise make_nested() in a loop.Nr   r   )Úexitr   r   r   Ú
run_thread–  s   ÿz1GCTests.test_trashcan_threads.<locals>.run_threadgñhãˆµøä>)Útargetc                      s
   ˆ   d¡S r4   ©r7   r   )rž   r   r   Ú<lambda>£  s   
 z/GCTests.test_trashcan_threads.<locals>.<lambda>ç      ð?)rQ   rd   ÚgetswitchintervalÚsetswitchintervalrŒ   Ú	threadingÚThreadr7   r   Zstart_threadsr“   r”   r8   r9   r:   rk   r–   r™   )r    Z	N_THREADSrŸ   Zold_switchintervalÚthreadsr   rB   r   )r   rœ   rž   r   r•   r   Útest_trashcan_threadsp  s*   
ÿ€zGCTests.test_trashcan_threadsc                 C   ób   G dd„ dƒ}|ƒ }|ƒ }||_ ||_ t ¡  ttjƒ}~~|  t ¡ d¡ |  ttjƒ|¡ d S )Nc                   @   r   )zGCTests.test_boom.<locals>.Boomc                 S   ó   | ` t‚r   ©ÚattrÚAttributeError©r    Zsomeattributer   r   r   Ú__getattr__¬  ó   z+GCTests.test_boom.<locals>.Boom.__getattr__N©r   r   r   r°   r   r   r   r   ÚBoom«  r   r³   é   ©r­   r8   r9   rk   r[   r:   )r    r³   rI   rZ   Ú
garbagelenr   r   r   Ú	test_boomª  s   
zGCTests.test_boomc                 C   rª   )Nc                   @   ó   e Zd Zdd„ Zdd„ ZdS )z!GCTests.test_boom2.<locals>.Boom2c                 S   ó
   d| _ d S ©Nr   ©r   r&   r   r   r   r!   Ä  r(   z*GCTests.test_boom2.<locals>.Boom2.__init__c                 S   ó    |  j d7  _ | j dkr| `t‚r4   ©r   r­   r®   r¯   r   r   r   r°   Ç  ó   
z-GCTests.test_boom2.<locals>.Boom2.__getattr__N©r   r   r   r!   r°   r   r   r   r   ÚBoom2Ã  ó    rÀ   r´   rµ   )r    rÀ   rI   rZ   r¶   r   r   r   Ú
test_boom2Â  s   

zGCTests.test_boom2c                 C   ód   G dd„ dt ƒ}|ƒ }|ƒ }||_||_t ¡  ttjƒ}~~|  t ¡ d¡ |  ttjƒ|¡ d S )Nc                   @   r   )z'GCTests.test_boom_new.<locals>.Boom_Newc                 S   r«   r   r¬   r¯   r   r   r   r°   â  r±   z3GCTests.test_boom_new.<locals>.Boom_New.__getattr__Nr²   r   r   r   r   ÚBoom_Newá  r   rÄ   r´   ©r   r­   r8   r9   rk   r[   r:   )r    rÄ   rI   rZ   r¶   r   r   r   Útest_boom_newÝ  s   
zGCTests.test_boom_newc                 C   rÃ   )Nc                   @   r¸   )z)GCTests.test_boom2_new.<locals>.Boom2_Newc                 S   r¹   rº   r»   r&   r   r   r   r!   ó  r(   z2GCTests.test_boom2_new.<locals>.Boom2_New.__init__c                 S   r¼   r4   r½   r¯   r   r   r   r°   ö  r¾   z5GCTests.test_boom2_new.<locals>.Boom2_New.__getattr__Nr¿   r   r   r   r   Ú	Boom2_Newò  rÁ   rÇ   r´   rÅ   )r    rÇ   rI   rZ   r¶   r   r   r   Útest_boom2_newñ  s   

zGCTests.test_boom2_newc                 C   sÐ   g d¢}t  |¡}| ¡  |  ||¡ t|ƒ}t  |¡}| ¡  |  ||¡ dddœ}g d¢}t  |¡}| ¡  |  ||¡ t  ddgddid	¡}| ¡  |  |d
d
gttdƒƒ ¡ |  t  ddd¡g ¡ d S )N)r5   é   r}   rÉ   é   )r5   r}   )r5   rÉ   r}   rÊ   r5   rA   r´   )r   r   r   r   r}   rI   y              @)r8   Zget_referentsÚsortr:   ÚtuplerQ   rŒ   )r    r—   ZgotZatupleZadictZexpectedr   r   r   Útest_get_referents  s"   



zGCTests.test_get_referentsc                 C   sÂ  |   t d ¡¡ |   t d¡¡ |   t d¡¡ |   t d¡¡ |   t d¡¡ |   t d¡¡ |   t d¡¡ |   t d¡¡ |   t tdƒ¡¡ |   t t¡¡ |   t t¡¡ |   t t¡¡ |   t tƒ ¡¡ G dd	„ d	ƒ}G d
d„ dtƒ}G dd„ dƒ}G dd„ dtƒ}G dd„ dtƒ}|  t t¡¡ |  t |¡¡ |  t |ƒ ¡¡ |  t |ƒ ¡¡ |  t g ¡¡ |  t t	ƒ ¡¡ |  t |ƒ ¡¡ |  t |ƒ ¡¡ |  t |ƒ ¡¡ d S )Nr5   r£   y      ð?      @TFó   arI   c                   @   rD   )z*GCTests.test_is_tracked.<locals>.UserClassNrE   r   r   r   r   Ú	UserClass1  rG   rÏ   c                   @   rD   )z(GCTests.test_is_tracked.<locals>.UserIntNrE   r   r   r   r   ÚUserInt4  rG   rÐ   c                   @   ó   e Zd ZdZdS )z/GCTests.test_is_tracked.<locals>.UserClassSlotsr   N©r   r   r   Ú	__slots__r   r   r   r   ÚUserClassSlots8  ó    rÔ   c                   @   rÑ   )z/GCTests.test_is_tracked.<locals>.UserFloatSlotsr   NrÒ   r   r   r   r   ÚUserFloatSlots<  rÕ   rÖ   c                   @   rÑ   )z-GCTests.test_is_tracked.<locals>.UserIntSlotsr   NrÒ   r   r   r   r   ÚUserIntSlots@  rÕ   r×   )
ÚassertFalser8   Z
is_trackedÚ	bytearrayÚtypeÚintr   ÚfloatÚ
assertTrueÚset)r    rÏ   rÐ   rÔ   rÖ   r×   r   r   r   Útest_is_tracked  s6   zGCTests.test_is_trackedc                    sb   |   t d¡¡ g ‰ G ‡ fdd„dƒ}|ƒ }|   t |¡¡ ~t ¡  ˆ  ¡ }|  t |¡¡ d S )NrÉ   c                       ó   e Zd Z‡ fdd„ZdS )z*GCTests.test_is_finalized.<locals>.Lazarusc                    ó   ˆ   | ¡ d S r   r¡   r&   ©Zstorager   r   rs   S  ó   z2GCTests.test_is_finalized.<locals>.Lazarus.__del__Nrt   r   râ   r   r   ÚLazarusR  ó    rä   )rØ   r8   Zis_finalizedr9   rl   rÝ   )r    rä   Zlazarusr   râ   r   Útest_is_finalizedM  s   zGCTests.test_is_finalizedc                    sˆ   g ‰‡ ‡fdd„‰dd„ t dƒD ƒ}‡fdd„|D ƒ‰ d }t ¡  |  tˆƒd¡ d }t ¡  |  tˆƒd¡ ˆD ]}|  |d ¡ q9d S )Nc                    s   dd„ ˆ D ƒˆd d …< d S )Nc                 S   s   g | ]}|ƒ ‘qS r   r   )Ú.0r,   r   r   r   Ú
<listcomp>d  s    z>GCTests.test_bug1055820b.<locals>.callback.<locals>.<listcomp>r   r%   )ÚWRsÚouchr   r   Úcallbackc  ó   z*GCTests.test_bug1055820b.<locals>.callbackc                 S   s   g | ]}t |ƒ‘qS r   )r   ©rç   r   r   r   r   rè   f  ó    z,GCTests.test_bug1055820b.<locals>.<listcomp>rA   c                    s   g | ]}t  |ˆ ¡‘qS r   )r*   r+   )rç   r€   )rë   r   r   rè   g  ó    r   )rŒ   r8   r9   r:   rk   )r    ZCsr€   r   r   )ré   rë   rê   r   Útest_bug1055820b_  s   ýzGCTests.test_bug1055820bc                    sD   t  ¡  G dd„ dƒ‰ G dd„ dƒ‰‡ ‡fdd„}|ƒ  t  ¡  d S )Nc                   @   rD   )z GCTests.test_bug21435.<locals>.ANrE   r   r   r   r   rF   ƒ  rG   rF   c                   @   r¸   )z GCTests.test_bug21435.<locals>.Bc                 S   s
   || _ d S r   r»   )r    r   r   r   r   r!   ‡  r(   z)GCTests.test_bug21435.<locals>.B.__init__c                 S   s
   d | _ d S r   ©r­   r&   r   r   r   rs   Š  r(   z(GCTests.test_bug21435.<locals>.B.__del__N)r   r   r   r!   rs   r   r   r   r   rP   †  rÁ   rP   c                     s    ˆ ƒ } ˆˆ ƒ ƒ}|| _ | |_ d S r   rñ   )rI   rZ   ©rF   rP   r   r   Údo_work  s   

z&GCTests.test_bug21435.<locals>.do_work)r8   r9   )r    ró   r   rò   r   Útest_bug21435w  s   
zGCTests.test_bug21435c                    sŠ   dd l ‰d}‡ ‡fdd„}||d ƒ}ˆ  d|¡ ˆ  d|¡ ||d ƒ}ˆ  d	|¡ ˆ  d
|v p4d|v |¡ ||d ƒ}ˆ  d|¡ d S )Nr   aÚ  if 1:
            import gc
            import _testcapi
            @_testcapi.with_tp_del
            class X:
                def __init__(self, name):
                    self.name = name
                def __repr__(self):
                    return "<X %%r>" %% self.name
                def __tp_del__(self):
                    pass

            x = X('first')
            x.x = x
            x.y = X('second')
            del x
            gc.set_debug(%s)
        c                    s\   ˆj tjdd| gˆjˆjd}| ¡ \}}|j ¡  |j ¡  ˆ  |j	d¡ ˆ  |d¡ |S )Nz-Wdú-c©ÚstdoutÚstderrr   ó    )
ÚPopenrd   Ú
executableÚPIPEÚcommunicater÷   Úcloserø   r:   Ú
returncode)ÚcodeÚpr÷   rø   ©r    Ú
subprocessr   r   Úrun_command¬  s   þ

z5GCTests.test_garbage_at_shutdown.<locals>.run_commandÚ0s=   ResourceWarning: gc: 2 uncollectable objects at shutdown; uses   <X 'first'>zgc.DEBUG_UNCOLLECTABLEs8   ResourceWarning: gc: 2 uncollectable objects at shutdowns   [<X 'first'>, <X 'second'>]s   [<X 'second'>, <X 'first'>]zgc.DEBUG_SAVEALLs!   uncollectable objects at shutdown)r  ZassertInZassertNotInrÝ   )r    r   r  rø   r   r  r   Útest_garbage_at_shutdown—  s$   ÿÿþz GCTests.test_garbage_at_shutdownc                 C   s(   d}t d|ƒ\}}}|  | ¡ d¡ d S )Nz¤if 1:
            class C:
                def __del__(self):
                    print('__del__ called')
            l = [C()]
            l.append(l)
            rõ   ó   __del__ called)r	   r:   Ústrip)r    r   ÚrcÚoutÚerrr   r   r   Útest_gc_main_module_at_shutdownÈ  s   z'GCTests.test_gc_main_module_at_shutdownc                 C   sf   t ƒ &}d}d|f }t|d|ƒ td|ƒ\}}}|  | ¡ d¡ W d   ƒ d S 1 s,w   Y  d S )Nz¼if 1:
                class C:
                    def __del__(self):
                        print('__del__ called')
                l = [C()]
                l.append(l)
                zvif 1:
                import sys
                sys.path.insert(0, %r)
                import gctest
                Zgctestrõ   r  )r   r
   r	   r:   r  )r    Z
script_dirÚmoduler   r	  r
  r  r   r   r   Ú#test_gc_ordinary_module_at_shutdownÕ  s   ü"ñz+GCTests.test_gc_ordinary_module_at_shutdownc                 C   sj   d}|   tt¡ ttddd}| |¡ W d   ƒ n1 sw   Y  ttƒ\}}}|  | ¡ d¡ d S )NzÊif 1:
            class ClassWithDel:
                def __del__(self):
                    print('__del__ called')
            a = ClassWithDel()
            a.link = a
            raise SystemExit(0)Úwzutf-8)Úencodingr  )Ú
addCleanupr   r   ÚopenÚwriter	   r:   r  )r    r   Zscriptr	  r
  r  r   r   r   Útest_global_del_SystemExitè  s   ÿz"GCTests.test_global_del_SystemExitc                 C   sr  t  ¡ }|  t|ƒd¡ |D ]*}|  |t¡ |  t|ƒh d£¡ |  |d d¡ |  |d d¡ |  |d d¡ qt  ¡ rG|  	t j
¡ t  ¡  t  ¡ }t  d¡ t  ¡ }|  |d d |d d d ¡ |  |d d |d d ¡ |  |d d |d d ¡ t  d¡ t  ¡ }|  |d d |d d d ¡ |  |d d |d d ¡ |  |d d |d d d ¡ d S )	NrÉ   >   Ú	collectedÚcollectionsÚuncollectabler  r   r  r  r5   rA   )r8   Ú	get_statsr:   rk   ÚassertIsInstanceÚdictrÞ   ZassertGreaterEqualÚ	isenabledr  rv   rx   r9   )r    ZstatsÚstÚoldÚnewr   r   r   Útest_get_statsö  s0   
ÿ
 
 $zGCTests.test_get_statsc                 C   s4   t  ¡  |  t  ¡ d¡ t  ¡  |  t  ¡ d¡ d S rº   )r8   Zfreezer   Zget_freeze_countZunfreezer:   r&   r   r   r   Útest_freeze  s   zGCTests.test_freezec                    sø  t  ¡  g ‰ ˆ  ˆ ¡ |  t‡ fdd„t jddD ƒƒ¡ |  t‡ fdd„t jddD ƒƒ¡ |  t‡ fdd„t jddD ƒƒ¡ t jdd |  t‡ fd	d„t jddD ƒƒ¡ |  t‡ fd
d„t jddD ƒƒ¡ |  t‡ fdd„t jddD ƒƒ¡ t jdd |  t‡ fdd„t jddD ƒƒ¡ |  t‡ fdd„t jddD ƒƒ¡ |  t‡ fdd„t jddD ƒƒ¡ t jdd |  t‡ fdd„t jddD ƒƒ¡ |  t‡ fdd„t jddD ƒƒ¡ |  t‡ fdd„t jddD ƒƒ¡ Š t  ¡  d S )Nc                 3   ó    | ]}ˆ |u V  qd S r   r   ©rç   Úelement©r;   r   r   Ú	<genexpr>  ó   € z+GCTests.test_get_objects.<locals>.<genexpr>r   ©Ú
generationc                 3   r!  r   r   r"  r$  r   r   r%    r&  r5   c                 3   r!  r   r   r"  r$  r   r   r%  !  r&  rA   c                 3   r!  r   r   r"  r$  r   r   r%  %  r&  c                 3   r!  r   r   r"  r$  r   r   r%  (  r&  c                 3   r!  r   r   r"  r$  r   r   r%  +  r&  c                 3   r!  r   r   r"  r$  r   r   r%  /  r&  c                 3   r!  r   r   r"  r$  r   r   r%  2  r&  c                 3   r!  r   r   r"  r$  r   r   r%  5  r&  c                 3   r!  r   r   r"  r$  r   r   r%  9  r&  c                 3   r!  r   r   r"  r$  r   r   r%  <  r&  c                 3   r!  r   r   r"  r$  r   r   r%  ?  r&  )r8   r9   r7   rÝ   ÚanyÚget_objectsrØ   r&   r   r$  r   Útest_get_objects  sX   
ÿÿÿÿÿÿÿÿÿÿÿÿzGCTests.test_get_objectsc                 C   sl   t  ¡  |  tt  ¡ ƒtt jd dƒ¡ |  tt jd¡ |  tt jd¡ |  tt jd¡ |  tt jd¡ d S )Nr'  iè  iüÿÿÚ1gX9´Èv¾ó?)r8   r9   r:   rk   r*  ZassertRaisesÚ
ValueErrorr   r&   r   r   r   Útest_get_objects_argumentsD  s   ÿz"GCTests.test_get_objects_argumentsc                    sª   G dd„ dƒ}G ‡ fdd„d|ƒ‰ t  ¡  t  ¡  ˆ ƒ }|  ˆ jd¡ ~t  ¡  |  ˆ jd¡ |  tˆ jƒd¡ ˆ j ¡  |  ˆ jd¡ t  ¡  |  ˆ jd¡ t  ¡  d S )Nc                   @   r   )zAGCTests.test_resurrection_only_happens_once_per_object.<locals>.Ac                 S   ó
   | | _ d S r   ©Úmer&   r   r   r   r!   P  r(   zJGCTests.test_resurrection_only_happens_once_per_object.<locals>.A.__init__Nr"   r   r   r   r   rF   O  r   rF   c                       s    e Zd ZdZg Z‡ fdd„ZdS )zGGCTests.test_resurrection_only_happens_once_per_object.<locals>.Lazarusr   c                    s   ˆ  j d7  _ ˆ j | ¡ d S r4   )ÚresurrectedÚresurrected_instancesr7   r&   ©rä   r   r   rs   W  s   zOGCTests.test_resurrection_only_happens_once_per_object.<locals>.Lazarus.__del__N)r   r   r   r2  r3  rs   r   r4  r   r   rä   S  s    rä   r   r5   )	r8   r9   rx   r:   r2  rk   r3  Úclearrv   )r    rF   Úlazr   r4  r   Ú.test_resurrection_only_happens_once_per_objectN  s   
z6GCTests.test_resurrection_only_happens_once_per_objectc                    s®   G dd„ dƒ}G ‡ fdd„dƒ‰ t  ¡  t  ¡  ˆ ƒ }|ƒ }t|ƒ}||_||_~~t  ¡  |  tˆ jƒd¡ ˆ j 	¡ }|  
t|dƒ¡ |  t|jƒ|¡ t  ¡  t  ¡  d S )Nc                   @   r   )z6GCTests.test_resurrection_is_transitive.<locals>.Cargoc                 S   r/  r   r0  r&   r   r   r   r!   t  r(   z?GCTests.test_resurrection_is_transitive.<locals>.Cargo.__init__Nr"   r   r   r   r   ÚCargos  r   r8  c                       s   e Zd Zg Z‡ fdd„ZdS )z8GCTests.test_resurrection_is_transitive.<locals>.Lazarusc                    s   ˆ j  | ¡ d S r   )r3  r7   r&   r4  r   r   rs   z  s   z@GCTests.test_resurrection_is_transitive.<locals>.Lazarus.__del__N)r   r   r   r3  rs   r   r4  r   r   rä   w  s    rä   r5   Úcargo)r8   r9   rx   rY   r9  r6  r:   rk   r3  rl   rÝ   Úhasattrrv   )r    r8  r6  r9  Zcargo_idÚinstancer   r4  r   Útest_resurrection_is_transitiver  s"   
z'GCTests.test_resurrection_is_transitivec                    sº  d}G dd„ dƒ}G ‡ fdd„d|ƒ}g ‰ dd„ }t  ¡  t  ¡  |ƒ \}}t|ƒD ]}|ƒ  q*t  ¡ }|ƒ \}	}
|  |d| ¡ |  |	| d| ¡ |  |
| d	¡ |	|
}}|ƒ  t  ¡ }|ƒ \}	}
|  |d	¡ |  |	| d	¡ |  |
| d	¡ |	|
}}t|ƒD ]}|ƒ  qƒ|ƒ  t  ¡ }|ƒ \}	}
|  |d| ¡ |  |	| d| ¡ |  |
| d	¡ |	|
}}ˆ  ¡  t  ¡ }|ƒ \}	}
|  |d
¡ |  |	| d
¡ |  |
| d	¡ t  ¡  d S )Néd   c                   @   r   )zLGCTests.test_resurrection_does_not_block_cleanup_of_other_objects.<locals>.Ac                 S   r/  r   r0  r&   r   r   r   r!   œ  r(   zUGCTests.test_resurrection_does_not_block_cleanup_of_other_objects.<locals>.A.__init__Nr"   r   r   r   r   rF   ›  r   rF   c                       rà   )zLGCTests.test_resurrection_does_not_block_cleanup_of_other_objects.<locals>.Zc                    rá   r   r¡   r&   ©Zzsr   r   rs      rã   zTGCTests.test_resurrection_does_not_block_cleanup_of_other_objects.<locals>.Z.__del__Nrt   r   r>  r   r   ÚZŸ  rå   r?  c                  S   s   t  ¡ d } | d | d fS )Néÿÿÿÿr  r  )r8   r  )r?   r   r   r   Úgetstats¥  r˜   zSGCTests.test_resurrection_does_not_block_cleanup_of_other_objects.<locals>.getstatsrA   r   r´   )r8   r9   rx   rŒ   r:   r5  rv   )r    r   rF   r?  rA  ZoldcZoldncr   rB   r€   Zncr   r>  r   Ú9test_resurrection_does_not_block_cleanup_of_other_objects”  sN   







zAGCTests.test_resurrection_does_not_block_cleanup_of_other_objectsNz%requires ContainerNoGC extension typec                 C   s’   t j ¡ }G dd„ dƒ}G dd„ dƒ}|ƒ }||_t|ƒ ƒ|_t |jj|¡|_	|j	g}| 
|¡ t ¡  t ¡  ~~t ¡  | ¡  t ¡  d S )Nc                   @   s   e Zd Zg d¢ZdS )z+GCTests.test_trash_weakref_clear.<locals>.A)rI   ÚyÚwzNrÒ   r   r   r   r   rF   ù  r   rF   c                   @   rD   )z+GCTests.test_trash_weakref_clear.<locals>.ZNrE   r   r   r   r   r?  ü  rG   r?  )ÚunittestZmockZMockrI   r   rC  r*   r+   ÚvaluerD  r7   r8   r9   rx   Zassert_not_calledrv   )r    rë   rF   r?  rI   Zwr_cycler   r   r   Útest_trash_weakref_clear×  s   
 
z GCTests.test_trash_weakref_clear)0r   r   r   r<   r@   rC   rL   rM   rO   rR   rT   r   r`   ra   rc   r   rh   ro   rz   r{   rƒ   r†   r‘   r©   r·   rÂ   rÆ   rÈ   rÍ   rß   ræ   rð   rô   r  r  r  r  r  r   r+  r.  r7  r<  rB  rE  ÚskipIfr   rG  r   r   r   r   r3   V   sd    
	


	


#:/ 
0.
$"
Cÿr3   c                   @   sd   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	e
dd„ ƒZe ed¡dd„ ƒZdS )ÚGCCallbackTestsc                 C   sL   t  ¡ | _t  ¡  t  ¡ | _t  d¡ t j | j	¡ t j | j
¡ g | _d S rº   )r8   r  Úenabledrx   ri   rn   rj   Ú	callbacksr7   Úcb1Úcb2Úothergarbager&   r   r   r   ÚsetUp  s   



zGCCallbackTests.setUpc                 C   sz   | ` tj | j¡ tj | j¡ t | j¡ | jrt 	¡  t 
¡  tjD ]
}t|tƒr.d |_q$tjd d …= | `t 
¡  d S r   )Úvisitr8   rK  r]   rL  rM  rj   rn   rJ  rv   r9   r[   Ú
isinstancer-   r.   rN  )r    r_   r   r   r   ÚtearDown  s   

€zGCCallbackTests.tearDownc                 C   sB   g | _ t ¡  tjd d … g }tjd d …< | j |¡ g | _ d S r   )rP  r8   r9   r[   rN  r7   )r    r[   r   r   r   Úpreclean/  s
   
zGCCallbackTests.precleanc                 C   s   | j  d|t|ƒf¡ d S r4   )rP  r7   r  )r    ÚphaseÚinfor   r   r   rL  9  rì   zGCCallbackTests.cb1c                 C   sn   | j  d|t|ƒf¡ |dkr1t| dƒr3dd„ tjD ƒ}dd„ tjD ƒtjd d …< |D ]	}d |_q+d S d S d S )NrA   ÚstopÚcleanupc                 S   s   g | ]	}t |tƒr|‘qS r   ©rQ  r-   ©rç   r‚   r   r   r   rè   @  s    z'GCCallbackTests.cb2.<locals>.<listcomp>c                 S   s   g | ]	}t |tƒs|‘qS r   rX  rY  r   r   r   rè   A  s    
ÿ)rP  r7   r  r:  r8   r[   r.   )r    rT  rU  Zucr‚   r   r   r   rM  <  s   úzGCCallbackTests.cb2c                 C   sò   |   ¡  t ¡  dd„ | jD ƒ}dd„ |D ƒ}dd„ |D ƒ}|  |dgd ¡ |  |dgd ¡ dd„ | jD ƒ}dd„ |D ƒ}d	d„ |D ƒ}|  |d
gd ¡ |  |dgd ¡ | jD ]}|d }|  d|v ¡ |  d|v ¡ |  d|v ¡ q[d S )Nc                 S   ó   g | ]}|d  ‘qS )r   r   ©rç   r   r   r   r   rè   M  rî   z0GCCallbackTests.test_collect.<locals>.<listcomp>c                 S   ó   g | ]}|d kr|‘qS ©r5   r   rí   r   r   r   rè   N  rï   c                 S   r\  )rA   r   rí   r   r   r   rè   O  rï   r5   rA   c                 S   rZ  r]  r   r[  r   r   r   rè   T  rî   c                 S   r\  )Ústartr   rí   r   r   r   rè   U  rï   c                 S   r\  )rV  r   rí   r   r   r   rè   V  rï   r^  rV  r(  r  r  )rS  r8   r9   rP  r:   rÝ   )r    rˆ   Zn1Zn2r   rU  r   r   r   Útest_collectF  s$   
üzGCCallbackTests.test_collectc                 C   s:   |   ¡  t d¡ | jD ]}|d }|  |d d¡ qd S )NrA   r(  )rS  r8   r9   rP  r:   )r    r   rU  r   r   r   Útest_collect_generationa  s   

þz'GCCallbackTests.test_collect_generationc                 C   s
  |   ¡  tƒ  tƒ  tdƒ t ¡  | jD ]}|d dkrq|d }|  |d d¡ |  |d d¡ q|  ttjƒd¡ tjD ]}|  	|t¡ q?d	| _
g | _g tjd d …< t ¡  | jD ]}|d dkreq\|d }|  |d d
¡ |  |d d¡ q\|  ttjƒd
¡ d S )Nr)   r5   rV  rA   r  r  é   r´   Tr   )rS  r-   r   r8   r9   rP  r:   rk   r[   r  rW  )r    r   rU  r‚   r   r   r   Útest_collect_garbageh  s2   


z$GCCallbackTests.test_collect_garbagezbuilt with -NDEBUGc                 C   sÂ   |   ¡  tdƒ dd l}t d¡}|jtjd|g|j|jd}| 	¡ \}}|j
 ¡  |j ¡  |  |d¡ |  |d¡ d}|  |d	| ¡ |  |d
¡ |  |d| ¡ |  |d¡ |  |d¡ d S )NZctypesr   a  
            from test.support import gc_collect, SuppressCrashReport

            a = [1, 2, 3]
            b = [a]

            # Avoid coredump when Py_FatalError() calls abort()
            SuppressCrashReport().__enter__()

            # Simulate the refcount of "a" being too low (compared to the
            # references held on it by live data), but keeping it above zero
            # (to avoid deallocating it):
            import ctypes
            ctypes.pythonapi.Py_DecRef(ctypes.py_object(a))

            # The garbage collector should now have a fatal error
            # when it reaches the broken object
            gc_collect()
        rõ   rö   sG   gcmodule\.c:[0-9]+: gc_decref: Assertion "gc_get_refs\(g\) > 0" failed.s   refcount is too smalls   [0-9a-fA-Fx]+s   object address  : s   object refcount : 1s   object type     : s   object type name: lists   object repr     : \[1, 2, 3\])rS  r   r  ÚtextwrapÚdedentrú   rd   rû   rü   rý   r÷   rþ   rø   ZassertRegex)r    r  r   r  r÷   rø   Zaddress_regexr   r   r   Útest_refcount_errors  sB   
þ

ÿÿÿÿÿÿÿz$GCCallbackTests.test_refcount_errorsN)r   r   r   rO  rR  rS  rL  rM  r_  r`  r   rb  rE  rH  ÚBUILD_WITH_NDEBUGre  r   r   r   r   rI    s    



$ÿrI  c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚGCTogglingTestsc                 C   ó   t  ¡  d S r   )r8   rv   r&   r   r   r   rO  Å  rS   zGCTogglingTests.setUpc                 C   rh  r   )r8   rx   r&   r   r   r   rR  È  rS   zGCTogglingTests.tearDownc           
         sÖ   t dƒ}t ¡  t dƒ}||_|`t dƒ}t |¡‰ g ‰‡ ‡fdd„}t ||¡}d  } }}g }d}tƒ }|jsV|d7 }|dkrF|  	d¡ |  
tˆƒd¡ | g ¡ |jr9|  
tˆƒd¡ ˆD ]}	|  
|	d ¡ q`d S )Nr   r5   rA   c                    ó   ˆ ƒ gˆd d …< d S r   r   r%   ©Zc2wrrê   r   r   rë   Û  ó   z2GCTogglingTests.test_bug1055820c.<locals>.callbacké'  ú'gc didn't happen after 10000 iterations)r   r8   r9   Zkeep_c0_aliver   r*   r+   r#   r$   r\   r:   rk   r7   )
r    Zc0Úc1Úc2rë   Zc0wrÚjunkr   Údetectorr   r   rj  r   Útest_bug1055820cË  s2   
 

ûýz GCTogglingTests.test_bug1055820cc           	         sÒ   g ‰G ‡ ‡fdd„dt ƒ}|dƒ}t ¡  t dƒ}||_|`t dƒ}t |¡‰ d  } }}tƒ }g }d}|jsT|d7 }|dkrD|  	d¡ |  
tˆƒd¡ | g ¡ |jr7|  
tˆƒd¡ ˆD ]}|  
|d ¡ q^d S )Nc                       s   e Zd Z‡ ‡fdd„ZdS )z+GCTogglingTests.test_bug1055820d.<locals>.Dc                    ri  r   r   r&   rj  r   r   rs     rk  z3GCTogglingTests.test_bug1055820d.<locals>.D.__del__Nrt   r   rj  r   r   ÚD  s    rs  r   r5   rA   rl  rm  )r   r8   r9   Zkeep_d0_aliver   r*   r+   r#   r$   r\   r:   rk   r7   )	r    rs  Zd0rn  ro  rq  rp  r   r   r   rj  r   Útest_bug1055820d  s0   


ûýz GCTogglingTests.test_bug1055820dN)r   r   r   rO  rR  rr  rt  r   r   r   r   rg  Ä  s
    Frg  c                   @   r   )ÚPythonFinalizationTestsc                 C   s   t  d¡}td|ƒ d S )Na   
            import ast
            import codecs

            # Small AST tree to keep their AST types alive
            tree = ast.parse("def f(x, y): return 2*x-y")
            x = [tree]
            x.append(x)

            # Put the cycle somewhere to survive until the last GC collection.
            # Codec search functions are only cleared at the end of
            # interpreter_clear().
            def search_func(encoding):
                return None
            search_func.a = x
            codecs.register(search_func)
        rõ   )rc  rd  r	   )r    r   r   r   r   Útest_ast_finiV  s   
z%PythonFinalizationTests.test_ast_finiN)r   r   r   rv  r   r   r   r   ru  U  r   ru  c                   C   sB   t  ¡ at  ¡  t  ¡ rJ ‚t  ¡ at  tt j @ ¡ t  ¡  d S r   )	r8   r  rJ  rx   ri   rn   rj   Z
DEBUG_LEAKr9   r   r   r   r   ÚsetUpModulep  s   rw  c                   C   s>   t  t¡ trtdƒ t  ¡  t  ¡ sJ ‚tst  ¡  d S d S )Nzrestoring automatic collection)	r8   rj   rn   r   Úprintrv   r  rJ  rx   r   r   r   r   ÚtearDownModulez  s   
ÿry  Ú__main__),rE  Zunittest.mockZtest.supportr   r   r   Ztest.support.import_helperr   Ztest.support.os_helperr   r   r   Ztest.support.script_helperr	   r
   r   r8   rd   Z	sysconfigrc  r¦   r“   r*   Z	_testcapir   ÚImportErrorr   r   r   r#   r-   Zget_config_varsÚgetrf  r:  ZTestCaser3   rI  rg  ru  rw  ry  r   Úmainr   r   r   r   Ú<module>   sb    ÿÿ       D 2 
ÿ