a
    "hW                     @   s  d dl Z d dlZ d dlmZmZmZmZmZmZm	Z	m
Z
 d dlmZ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y   dd ZY n0 zd dlmZ W n ey   dZY n0 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re )  dS )    N)verboserefcount_testcpython_onlystart_threadstemp_dirTESTFNunlinkimport_module)assert_python_okmake_script)with_tp_delc                 C   s   G dd dt }|S )Nc                   @   s   e Zd Zdd ZdS )zwith_tp_del.<locals>.Cc                 _   s   t dd S )Nzrequires _testcapi.with_tp_del)	TypeError)clsargskwargs r   4/opt/python-3.9.21/usr/lib/python3.9/test/test_gc.py__new__   s    zwith_tp_del.<locals>.C.__new__N)__name__
__module____qualname__r   r   r   r   r   C   s   r   )object)r   r   r   r   r   r      s    r   )ContainerNoGCc                   @   s   e Zd Zdd ZdS )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   '   s   r   c                   @   s   e Zd Zdd ZdS )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_happened3   s    z)GC_Detector.__init__.<locals>.it_happened  )r"   weakrefrefr   wr)r   r%   r   r$   r   r   0   s    zGC_Detector.__init__Nr    r   r   r   r   r!   ,   s   r!   c                   @   s   e Zd ZdddZdd ZdS )UncollectableNc                 C   s    |d u rt | d| _n|| _d S )N)partner)r*   r+   )r   r+   r   r   r   r   B   s    zUncollectable.__init__c                 C   s   d S r   r   r$   r   r   r   
__tp_del__G   s    zUncollectable.__tp_del__)N)r   r   r   r   r,   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_listV   s
    
zGCTests.test_listc                 C   s*   i }||d< t   ~| t  d d S r/   r3   r4   r5   r   dr   r   r   	test_dict]   s
    zGCTests.test_dictc                 C   s4   g }|f}| | t  ~~| t d d S )N   r1   )r   r6   tr   r   r   
test_tupled   s    
zGCTests.test_tuplec                 C   s2   G dd d}||_ t  ~| t d d S )Nc                   @   s   e Zd ZdS )zGCTests.test_class.<locals>.ANr   r   r   r   r   r   r   Ao   s   r@   r   ar3   r4   assertNotEqualr   r@   r   r   r   
test_classn   s
    zGCTests.test_classc                 C   s.   G dd dt }t  ~| t d d S )Nc                   @   s   e Zd ZdS )z%GCTests.test_newstyleclass.<locals>.ANr?   r   r   r   r   r@   w   s   r@   r   )r   r3   r4   rC   rD   r   r   r   test_newstyleclassv   s    zGCTests.test_newstyleclassc                 C   s8   G dd d}| }||_ t  ~| t d d S )Nc                   @   s   e Zd ZdS )z GCTests.test_instance.<locals>.ANr?   r   r   r   r   r@   ~   s   r@   r   rA   r   r@   rB   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                   @   s   e Zd ZdS )z#GCTests.test_newinstance.<locals>.ANr?   r   r   r   r   r@      s   r@   r   c                   @   s   e Zd ZdS )z#GCTests.test_newinstance.<locals>.BNr?   r   r   r   r   B   s   rI   c                   @   s   e Zd ZdS )z#GCTests.test_newinstance.<locals>.CNr?   r   r   r   r   r      s   r   )r   rB   r3   r4   rC   listr5   )r   r@   rB   rI   r   r   r   r   test_newinstance   s&    zGCTests.test_newinstancec                 C   s2   G dd d}| }t   ~| t  d d S )Nc                   @   s   e Zd Zdd ZdS )zGCTests.test_method.<locals>.Ac                 S   s   | j | _d S r   )r   initr$   r   r   r   r      s    z'GCTests.test_method.<locals>.A.__init__Nr    r   r   r   r   r@      s   r@   r   )r3   r4   rC   rG   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rb|` qqb| d tj	| d S )Nc                   @   s   e Zd Zdd ZdS )z(GCTests.test_legacy_finalizer.<locals>.Ac                 S   s   d S r   r   r$   r   r   r   r,          z3GCTests.test_legacy_finalizer.<locals>.A.__tp_del__Nr   r   r   r,   r   r   r   r   r@      s   r@   c                   @   s   e Zd ZdS )z(GCTests.test_legacy_finalizer.<locals>.BNr?   r   r   r   r   rI      s   rI   r   &didn't find obj in garbage (finalizer))
r   rB   idbr3   r4   rC   garbagefailremover   r@   rI   rB   Zid_arR   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rf|` qqf| 	d tj
| d S )Nc                   @   s   e Zd Zdd ZdS )z1GCTests.test_legacy_finalizer_newclass.<locals>.Ac                 S   s   d S r   r   r$   r   r   r   r,      rN   z<GCTests.test_legacy_finalizer_newclass.<locals>.A.__tp_del__NrO   r   r   r   r   r@      s   r@   c                   @   s   e Zd ZdS )z1GCTests.test_legacy_finalizer_newclass.<locals>.BNr?   r   r   r   r   rI      s   rI   r   rP   )r   r   rB   rQ   rR   r3   r4   rC   rS   rT   rU   rV   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
r<   )execr3   r4   r5   r9   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   s    zGCTests.test_frame.<locals>.fr0   r8   )r   r_   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 r/   )r3   r4   r5   rS   r2   rQ   	get_debug	set_debugZDEBUG_SAVEALLlenpop)r   LZid_LdebugrW   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 )Nr0   c                   @   s   e Zd Zdd ZdS )zGCTests.test_del.<locals>.Ac                 S   s   t |  d S r   dirr$   r   r   r   __del__  s    z#GCTests.test_del.<locals>.A.__del__Nr   r   r   rj   r   r   r   r   r@     s   r@   )r3   get_thresholdenableset_thresholddisabler   Z
thresholdsr@   rB   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 )Nr0   c                   @   s   e Zd Zdd ZdS )z$GCTests.test_del_newclass.<locals>.Ac                 S   s   t |  d S r   rh   r$   r   r   r   rj     s    z,GCTests.test_del_newclass.<locals>.A.__del__Nrk   r   r   r   r   r@     s   r@   )r3   rl   rm   rn   r   ro   rp   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      )r3   r4   	get_countr5   Z
assertLessassertGreater)r   rB   rR   cxr:   er_   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   r0   r<   )r0   r   )r   r0   rs   )r3   r4   ru   r5   )r   rx   rB   rR   rw   r:   ry   r_   ghr   r   r   r   test_collect_generations7  s    


z GCTests.test_collect_generationsc                    s   G  fddd t   d}tdD ]Z}g }t|D ]}|  g}q6g }t|D ]}|  g}qRi }t|D ]}|  d}qnq&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 )Nr0      r   )nr3   r4   r$   Ouchr   r   rj   O  s    z+GCTests.test_trashcan.<locals>.Ouch.__del__N)r   r   r   r   rj   r   r   r   r   r   M  s   r      r<   )r0   r<   )r3   rm   rangero   )r   Ncountr=   r   uvr   r   r   test_trashcanL  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 zvg g }t|D ]}tj|d}|| qft|fdd t	
d W d    n1 s0    Y  W t| nt| 0 t  | t jt j d S )N<   r<   c                	   s   s&   zd V  W t d nt d 0 d S )Ngư>)timesleepr   r   r   r   sleeper_gent  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   )initsr2   )r   alist)r   r   r   r     s    z1GCTests.test_trashcan_threads.<locals>.C.__init__c                    s    j d   }t| d S r   )delsr2   next)r   r{   r   r   r   r   rj     s    z0GCTests.test_trashcan_threads.<locals>.C.__del__N)r   r   r   r   r   r   rj   r   r   r   r   r   {  s   r   c                     s(    g } t D ]} | gg} q~ d S r   )r   )rx   r   )r   NESTINGr   r   make_nested  s    z2GCTests.test_trashcan_threads.<locals>.make_nestedc                      s    s  q d S r   r   r   )exitr   r   r   
run_thread  s    z1GCTests.test_trashcan_threads.<locals>.run_threadgh㈵>)targetc                      s
     dS r/   r2   r   )r   r   r   <lambda>  rN   z/GCTests.test_trashcan_threads.<locals>.<lambda>      ?)rJ   r\   getswitchintervalsetswitchintervalr   	threadingThreadr2   r   r   r   r3   r4   r5   rc   r   r   )r   Z	N_THREADSr   Zold_switchintervalthreadsr   r=   r   )r   r   r   r   r   r   test_trashcan_threadso  s&    
*zGCTests.test_trashcan_threadsc                 C   sb   G dd d}| }| }||_ ||_ t  ttj}~~| t d | ttj| d S )Nc                   @   s   e Zd Zdd ZdS )zGCTests.test_boom.<locals>.Boomc                 S   s   | ` td S r   attrAttributeErrorr   Zsomeattributer   r   r   __getattr__  s    z+GCTests.test_boom.<locals>.Boom.__getattr__Nr   r   r   r   r   r   r   r   Boom  s   r      r   r3   r4   rc   rS   r5   )r   r   rB   rR   
garbagelenr   r   r   	test_boom  s    
zGCTests.test_boomc                 C   sb   G dd d}| }| }||_ ||_ t  ttj}~~| t d | ttj| d S )Nc                   @   s   e Zd Zdd Zdd ZdS )z!GCTests.test_boom2.<locals>.Boom2c                 S   s
   d| _ d S Nr   rx   r$   r   r   r   r     s    z*GCTests.test_boom2.<locals>.Boom2.__init__c                 S   s$   |  j d7  _ | j dkr| `td S r/   rx   r   r   r   r   r   r   r     s    
z-GCTests.test_boom2.<locals>.Boom2.__getattr__Nr   r   r   r   r   r   r   r   r   Boom2  s   r   r   r   )r   r   rB   rR   r   r   r   r   
test_boom2  s    

zGCTests.test_boom2c                 C   sd   G dd dt }| }| }||_||_t  ttj}~~| t d | ttj| d S )Nc                   @   s   e Zd Zdd ZdS )z'GCTests.test_boom_new.<locals>.Boom_Newc                 S   s   | ` td S r   r   r   r   r   r   r     s    z3GCTests.test_boom_new.<locals>.Boom_New.__getattr__Nr   r   r   r   r   Boom_New  s   r   r   r   r   r3   r4   rc   rS   r5   )r   r   rB   rR   r   r   r   r   test_boom_new  s    
zGCTests.test_boom_newc                 C   sd   G dd dt }| }| }||_||_t  ttj}~~| t d | ttj| d S )Nc                   @   s   e Zd Zdd Zdd ZdS )z)GCTests.test_boom2_new.<locals>.Boom2_Newc                 S   s
   d| _ d S r   r   r$   r   r   r   r     s    z2GCTests.test_boom2_new.<locals>.Boom2_New.__init__c                 S   s$   |  j d7  _ | j dkr| `td S r/   r   r   r   r   r   r     s    
z5GCTests.test_boom2_new.<locals>.Boom2_New.__getattr__Nr   r   r   r   r   	Boom2_New  s   r   r   r   )r   r   rB   rR   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)r0      rt   r      )r0   rt   )r0   r   rt   r   r0   r<   r   )r   r   r   r   rt   rB   y              @)r3   Zget_referentssortr5   tuplerJ   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 )Nr0   r   y      ?      @TF   arB   c                   @   s   e Zd ZdS )z*GCTests.test_is_tracked.<locals>.UserClassNr?   r   r   r   r   	UserClass0  s   r   c                   @   s   e Zd ZdS )z(GCTests.test_is_tracked.<locals>.UserIntNr?   r   r   r   r   UserInt3  s   r   c                   @   s   e Zd ZdZdS )z/GCTests.test_is_tracked.<locals>.UserClassSlotsr   Nr   r   r   	__slots__r   r   r   r   UserClassSlots7  s   r   c                   @   s   e Zd ZdZdS )z/GCTests.test_is_tracked.<locals>.UserFloatSlotsr   Nr   r   r   r   r   UserFloatSlots;  s   r   c                   @   s   e Zd ZdZdS )z-GCTests.test_is_tracked.<locals>.UserIntSlotsr   Nr   r   r   r   r   UserIntSlots?  s   r   )
assertFalser3   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                       s   e Zd Z fddZdS )z*GCTests.test_is_finalized.<locals>.Lazarusc                    s     |  d S r   r   r$   Zstorager   r   rj   R  s    z2GCTests.test_is_finalized.<locals>.Lazarus.__del__Nrk   r   r   r   r   LazarusQ  s   r   )r   r3   Zis_finalizedr4   rd   r   )r   r   Zlazarusr   r   r   test_is_finalizedL  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  qrd S )Nc                    s   dd  D d d < d S )Nc                 S   s   g | ]
}| qS r   r   ).0r)   r   r   r   
<listcomp>c  rN   z>GCTests.test_bug1055820b.<locals>.callback.<locals>.<listcomp>r   r#   )WRsouchr   r   callbackb  s    z*GCTests.test_bug1055820b.<locals>.callbackc                 S   s   g | ]}t |qS r   )r   r   r   r   r   r   r   e  rN   z,GCTests.test_bug1055820b.<locals>.<listcomp>r<   c                    s   g | ]}t | qS r   )r'   r(   )r   rw   )r   r   r   r   f  rN   r   )r   r3   r4   r5   rc   )r   ZCsrw   rx   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                   @   s   e Zd ZdS )z GCTests.test_bug21435.<locals>.ANr?   r   r   r   r   r@     s   r@   c                   @   s   e Zd Zdd Zdd ZdS )z GCTests.test_bug21435.<locals>.Bc                 S   s
   || _ d S r   r   )r   rx   r   r   r   r     s    z)GCTests.test_bug21435.<locals>.B.__init__c                 S   s
   d | _ d S r   r   r$   r   r   r   rj     s    z(GCTests.test_bug21435.<locals>.B.__del__N)r   r   r   r   rj   r   r   r   r   rI     s   rI   c                     s      }   }|| _ | |_ d S r   r   )rB   rR   r@   rI   r   r   do_work  s    
z&GCTests.test_bug21435.<locals>.do_work)r3   r4   )r   r   r   r   r   test_bug21435v  s    
zGCTests.test_bug21435c                    s   dd l d} fdd}||d } d|  d| ||d } d	|  d
|v phd|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   rN   )
Popenr\   
executablePIPEcommunicater   closer   r5   
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 )Nzif 1:
            class C:
                def __del__(self):
                    print('__del__ called')
            l = [C()]
            l.append(l)
            r      __del__ called)r
   r5   strip)r   r   rcouterrr   r   r   test_gc_main_module_at_shutdown  s    z'GCTests.test_gc_main_module_at_shutdownc                 C   sd   t  J}d}d|f }t|d| td|\}}}| | d W d    n1 sV0    Y  d S )Nzif 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
   r5   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   sf   d}|  tt ttd}|| W d    n1 s:0    Y  tt\}}}| | d d S )Nzif 1:
            class ClassWithDel:
                def __del__(self):
                    print('__del__ called')
            a = ClassWithDel()
            a.link = a
            raise SystemExit(0)wr   )
addCleanupr   r   openwriter
   r5   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 | t|h d | |d d | |d d | |d d qt  r| 	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   >   uncollectable	collectedcollectionsr   r   r   r   r0   r<   )r3   	get_statsr5   rc   assertIsInstancedictr   ZassertGreaterEqual	isenabledr   rm   ro   r4   )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   )r3   Zfreezerv   Zget_freeze_countZunfreezer5   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   s   | ]} |u V  qd S r   r   r   elementr6   r   r   	<genexpr>  rN   z+GCTests.test_get_objects.<locals>.<genexpr>r   
generationc                 3   s   | ]} |u V  qd S r   r   r  r  r   r   r    rN   r0   c                 3   s   | ]} |u V  qd S r   r   r  r  r   r   r     rN   r<   c                 3   s   | ]} |u V  qd S r   r   r  r  r   r   r  $  rN   c                 3   s   | ]} |u V  qd S r   r   r  r  r   r   r  '  rN   c                 3   s   | ]} |u V  qd S r   r   r  r  r   r   r  *  rN   c                 3   s   | ]} |u V  qd S r   r   r  r  r   r   r  .  rN   c                 3   s   | ]} |u V  qd S r   r   r  r  r   r   r  1  rN   c                 3   s   | ]} |u V  qd S r   r   r  r  r   r   r  4  rN   c                 3   s   | ]} |u V  qd S r   r   r  r  r   r   r  8  rN   c                 3   s   | ]} |u V  qd S r   r   r  r  r   r   r  ;  rN   c                 3   s   | ]} |u V  qd S r   r   r  r  r   r   r  >  rN   )r3   r4   r2   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1gX9v?)r3   r4   r5   rc   r
  ZassertRaises
ValueErrorr   r$   r   r   r   test_get_objects_argumentsC  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                   @   s   e Zd Zdd ZdS )zAGCTests.test_resurrection_only_happens_once_per_object.<locals>.Ac                 S   s
   | | _ d S r   mer$   r   r   r   r   O  s    zJGCTests.test_resurrection_only_happens_once_per_object.<locals>.A.__init__Nr    r   r   r   r   r@   N  s   r@   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 r/   )resurrectedresurrected_instancesr2   r$   r   r   r   rj   V  s    zOGCTests.test_resurrection_only_happens_once_per_object.<locals>.Lazarus.__del__N)r   r   r   r  r  rj   r   r  r   r   r   R  s   r   r   r0   )	r3   r4   ro   r5   r  rc   r  clearrm   )r   r@   lazr   r  r   .test_resurrection_only_happens_once_per_objectM  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                   @   s   e Zd Zdd ZdS )z6GCTests.test_resurrection_is_transitive.<locals>.Cargoc                 S   s
   | | _ d S r   r  r$   r   r   r   r   s  s    z?GCTests.test_resurrection_is_transitive.<locals>.Cargo.__init__Nr    r   r   r   r   Cargor  s   r  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   )r  r2   r$   r  r   r   rj   y  s    z@GCTests.test_resurrection_is_transitive.<locals>.Lazarus.__del__N)r   r   r   r  rj   r   r  r   r   r   v  s   r   r0   cargo)r3   r4   ro   rQ   r  r  r5   rc   r  rd   r   hasattrrm   )r   r  r  r  Zcargo_idinstancer   r  r   test_resurrection_is_transitiveq  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 ]
}|  qTt  }| \}	}
| |d|  | |	| d|  | |
| d	 |	|
 }}|  t  }| \}	}
| |d	 | |	| d	 | |
| d	 |	|
 }}t|D ]}|  q|  t  }| \}	}
| |d|  | |	| d|  | |
| d	 |	|
 }}   t  }| \}	}
| |d
 | |	| d
 | |
| d	 t   d S )Nd   c                   @   s   e Zd Zdd ZdS )zLGCTests.test_resurrection_does_not_block_cleanup_of_other_objects.<locals>.Ac                 S   s
   | | _ d S r   r  r$   r   r   r   r     s    zUGCTests.test_resurrection_does_not_block_cleanup_of_other_objects.<locals>.A.__init__Nr    r   r   r   r   r@     s   r@   c                       s   e Zd Z fddZdS )zLGCTests.test_resurrection_does_not_block_cleanup_of_other_objects.<locals>.Zc                    s     |  d S r   r   r$   Zzsr   r   rj     s    zTGCTests.test_resurrection_does_not_block_cleanup_of_other_objects.<locals>.Z.__del__Nrk   r   r  r   r   Z  s   r  c                  S   s   t  d } | d | d fS )Nr   r   )r3   r   )r:   r   r   r   getstats  s    zSGCTests.test_resurrection_does_not_block_cleanup_of_other_objects.<locals>.getstatsr<   r   r   )r3   r4   ro   r   r5   r  rm   )r   r   r@   r  r   ZoldcZoldncr   r=   rw   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)rB   ywzNr   r   r   r   r   r@     s   r@   c                   @   s   e Zd ZdS )z+GCTests.test_trash_weakref_clear.<locals>.ZNr?   r   r   r   r   r    s   r  )unittestZmockZMockrB   r   r"  r'   r(   valuer#  r2   r3   r4   ro   Zassert_not_calledrm   )r   r   r@   r  rB   Zwr_cycler   r   r   test_trash_weakref_clear  s     

z GCTests.test_trash_weakref_clear)0r   r   r   r7   r;   r>   rE   rF   rH   rK   rM   r   rX   rY   r[   r   r`   rg   rq   rr   rz   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r  r!  r$  skipIfr   r&  r   r   r   r   r.   U   sb   
	


	


#:/ 
0.
$"C
r.   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   )r3   r   enabledro   ra   rf   rb   	callbacksr2   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rHd |_qHtjd d = | `t
  d S r   )visitr3   r*  rU   r+  r,  rb   rf   r)  rm   r4   rS   
isinstancer*   r+   r-  )r   rW   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   )r/  r3   r4   rS   r-  r2   )r   rS   r   r   r   preclean.  s
    zGCCallbackTests.precleanc                 C   s   | j d|t|f d S r/   )r/  r2   r   )r   phaseinfor   r   r   r+  8  s    zGCCallbackTests.cb1c                 C   sf   | j d|t|f |dkrbt| drbdd tjD }dd tjD tjd d < |D ]
}d |_qVd S )Nr<   stopcleanupc                 S   s   g | ]}t |tr|qS r   r0  r*   r   ry   r   r   r   r   ?  rN   z'GCCallbackTests.cb2.<locals>.<listcomp>c                 S   s   g | ]}t |ts|qS r   r7  r8  r   r   r   r   @  s   
)r/  r2   r   r  r3   rS   r+   )r   r3  r4  Zucry   r   r   r   r,  ;  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 ]6}|d }| d|v  | d|v  | d|v  qd S )Nc                 S   s   g | ]}|d  qS )r   r   r   r   r   r   r   r   L  rN   z0GCCallbackTests.test_collect.<locals>.<listcomp>c                 S   s   g | ]}|d kr|qS r0   r   r   r   r   r   r   M  rN   c                 S   s   g | ]}|d kr|qS )r<   r   r   r   r   r   r   N  rN   r0   r<   c                 S   s   g | ]}|d  qS r:  r   r9  r   r   r   r   S  rN   c                 S   s   g | ]}|d kr|qS )startr   r   r   r   r   r   T  rN   c                 S   s   g | ]}|d kr|qS )r5  r   r   r   r   r   r   U  rN   r;  r5  r  r   r   )r2  r3   r4   r/  r5   r   )r   r   Zn1Zn2r   r4  r   r   r   test_collectE  s"    
zGCCallbackTests.test_collectc                 C   s:   |    td | jD ]}|d }| |d d qd S )Nr<   r  )r2  r3   r4   r/  r5   )r   r   r4  r   r   r   test_collect_generation`  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rq|d }| |d d
 | |d d q| ttjd
 d S )Nr&   r0   r5  r<   r   r      r   Tr   )r2  r*   r   r3   r4   r/  r5   rc   rS   r   r6  )r   r   r4  ry   r   r   r   test_collect_garbageg  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\])r2  r	   r   textwrapdedentr   r\   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   r.  r1  r2  r+  r,  r<  r=  r   r?  r$  r'  BUILD_WITH_NDEBUGrB  r   r   r   r   r(    s   



$r(  c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
GCTogglingTestsc                 C   s   t   d S r   )r3   rm   r$   r   r   r   r.    s    zGCTogglingTests.setUpc                 C   s   t   d S r   )r3   ro   r$   r   r   r   r1    s    zGCTogglingTests.tearDownc           
         s   t d}t  t d}||_|`t d}t| g  fdd}t||}d  } }}g }d}t }|js|d7 }|dkr| 	d | 
td |g  ql| 
td D ]}	| 
|	d  qd S )Nr   r0   r<   c                    s     gd d < d S r   r   r#   Zc2wrr   r   r   r     s    z2GCTogglingTests.test_bug1055820c.<locals>.callback'  'gc didn't happen after 10000 iterations)r   r3   r4   Zkeep_c0_aliver   r'   r(   r!   r"   rT   r5   rc   r2   )
r   Zc0c1c2r   Zc0wrjunkr   detectorrx   r   rE  r   test_bug1055820c  s.    
 
z GCTogglingTests.test_bug1055820cc           	         s   g G  fdddt }|d}t  t d}||_|`t d}t| d  } }}t }g }d}|js|d7 }|dkr| 	d | 
td |g  qh| 
td D ]}| 
|d  qd S )Nc                       s   e Zd Z fddZdS )z+GCTogglingTests.test_bug1055820d.<locals>.Dc                    s     gd d < d S r   r   r$   rE  r   r   rj     s    z3GCTogglingTests.test_bug1055820d.<locals>.D.__del__Nrk   r   rE  r   r   D  s   rM  r   r0   r<   rF  rG  )r   r3   r4   Zkeep_d0_aliver   r'   r(   r!   r"   rT   r5   rc   r2   )	r   rM  Zd0rH  rI  rK  rJ  r   rx   r   rE  r   test_bug1055820d  s,    

z GCTogglingTests.test_bug1055820dN)r   r   r   r.  r1  rL  rN  r   r   r   r   rD    s   FrD  c                   @   s   e Zd Zdd ZdS )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   )r@  rA  r
   )r   r   r   r   r   test_ast_finiU  s    
z%PythonFinalizationTests.test_ast_finiN)r   r   r   rP  r   r   r   r   rO  T  s   rO  c                   C   s6   t  at   t  at tt j @  t   d S r   )	r3   r   r)  ro   ra   rf   rb   Z
DEBUG_LEAKr4   r   r   r   r   setUpModuleo  s
    rQ  c                   C   s.   t t trtd t   ts*t   d S )Nzrestoring automatic collection)r3   rb   rf   r   printrm   r)  ro   r   r   r   r   tearDownModuley  s    
rS  __main__)*r$  Zunittest.mockZtest.supportr   r   r   r   r   r   r   r	   Ztest.support.script_helperr
   r   r3   r\   Z	sysconfigr@  r   r   r'   Z	_testcapir   ImportErrorr   r   r   r!   r*   Zget_config_varsgetrC  r  ZTestCaser.   r(  rD  rO  rQ  rS  r   mainr   r   r   r   <module>   sT   (

       D 2 

