o
    gG                     @   s  d dl Z d dlZ d dlmZ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yc   dd	 ZY nw zd d
lmZ W n eyw   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rd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)e*dkre)  dS dS )     N)verboserefcount_testrun_unittest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   B/Users/admin/.pyenv/versions/3.10.0/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"   r1   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 r5   r9   r:   r;   r!   dr   r   r   	test_dict^   s
   zGCTests.test_dictc                 C   s4   g }|f}| | t  ~~| t d d S )N   r7   )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       rG   r   ar9   r:   assertNotEqualr!   rG   r   r   r   
test_classo   s
   zGCTests.test_classc                 C   s.   G dd dt }t  ~| t d d S )Nc                   @   rE   )z%GCTests.test_newstyleclass.<locals>.ANrF   r   r   r   r   rG   x   rH   rG   r   )r   r9   r:   rK   rL   r   r   r   test_newstyleclassw   s   zGCTests.test_newstyleclassc                 C   s8   G dd d}| }||_ t  ~| t d d S )Nc                   @   rE   )z GCTests.test_instance.<locals>.ANrF   r   r   r   r   rG      rH   rG   r   rI   r!   rG   rJ   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                   @   rE   )z#GCTests.test_newinstance.<locals>.ANrF   r   r   r   r   rG      rH   rG   r   c                   @   rE   )z#GCTests.test_newinstance.<locals>.BNrF   r   r   r   r   B   rH   rQ   c                   @   rE   )z#GCTests.test_newinstance.<locals>.CNrF   r   r   r   r   r      rH   r   )r   rJ   r9   r:   rK   listr;   )r!   rG   rJ   rQ   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   rG      r   rG   r   )r9   r:   rK   rO   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=|` qCq1| d tj	| d S )Nc                   @   r   )z(GCTests.test_legacy_finalizer.<locals>.Ac                 S   r0   r   r   r'   r   r   r   r1          z3GCTests.test_legacy_finalizer.<locals>.A.__tp_del__Nr   r   r   r1   r   r   r   r   rG          rG   c                   @   rE   )z(GCTests.test_legacy_finalizer.<locals>.BNrF   r   r   r   r   rQ      rH   rQ   r   &didn't find obj in garbage (finalizer))
r   rJ   idbr9   r:   rK   garbagefailremover!   rG   rQ   rJ   Zid_ar[   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?|` qEq3| 	d tj
| d S )Nc                   @   r   )z1GCTests.test_legacy_finalizer_newclass.<locals>.Ac                 S   r0   r   r   r'   r   r   r   r1      rV   z<GCTests.test_legacy_finalizer_newclass.<locals>.A.__tp_del__NrW   r   r   r   r   rG      rX   rG   c                   @   rE   )z1GCTests.test_legacy_finalizer_newclass.<locals>.BNrF   r   r   r   r   rQ      rH   rQ   r   rY   )r   r   rJ   rZ   r[   r9   r:   rK   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
rB   )execr9   r:   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   rT   zGCTests.test_frame.<locals>.fr6   r>   )r!   rh   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 r5   )r9   r:   r;   r\   r8   rZ   	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 )Nr6   c                   @   r   )zGCTests.test_del.<locals>.Ac                 S      t |  d S r   dirr'   r   r   r   __del__  rT   z#GCTests.test_del.<locals>.A.__del__Nr   r   r   rt   r   r   r   r   rG     r   rG   )r9   get_thresholdenableset_thresholddisabler!   Z
thresholdsrG   rJ   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 )Nr6   c                   @   r   )z$GCTests.test_del_newclass.<locals>.Ac                 S   rq   r   rr   r'   r   r   r   rt     rT   z,GCTests.test_del_newclass.<locals>.A.__del__Nru   r   r   r   r   rG     r   rG   )r9   rv   rw   rx   r   ry   rz   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      )r9   r:   	get_countr;   Z
assertLessassertGreater)r!   rJ   r[   cxr@   erh   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   r6   rB   )r6   r   )r   r6   r}   )r9   r:   r   r;   )r!   r   rJ   r[   r   r@   r   rh   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 )Nr6      r   )nr9   r:   r'   Ouchr   r   rt   P  s   z+GCTests.test_trashcan.<locals>.Ouch.__del__N)r   r   r   r   rt   r   r   r   r   r   N  s    r      rB   )r6   rB   )r9   rw   rangery   )r!   NcountrC   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<   rB   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   )initsr8   )r!   alist)r   r   r   r"        z1GCTests.test_trashcan_threads.<locals>.C.__init__c                    s    j d   }t| d S r   )delsr8   next)r!   r   r   r   r   r   rt     s   z0GCTests.test_trashcan_threads.<locals>.C.__del__N)r   r   r   r   r   r"   rt   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_threadgh㈵>)targetc                      s
     dS r5   r8   r   )r   r   r   <lambda>  s   
 z/GCTests.test_trashcan_threads.<locals>.<lambda>      ?)rR   re   getswitchintervalsetswitchintervalr   	threadingThreadr8   r   Zstart_threadsr   r   r9   r:   r;   rl   r   r   )r!   Z	N_THREADSr   Zold_switchintervalthreadsr   rC   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   r9   r:   rl   r\   r;   )r!   r   rJ   r[   
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r5   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   rJ   r[   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   r9   r:   rl   r\   r;   )r!   r   rJ   r[   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   r5   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   rJ   r[   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)r6      r~   r      )r6   r~   )r6   r   r~   r   r6   rB   r   )r   r   r   r   r~   rJ   y              @)r9   Zget_referentssortr;   tuplerR   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 )Nr6   r   y      ?      @TF   arJ   c                   @   rE   )z*GCTests.test_is_tracked.<locals>.UserClassNrF   r   r   r   r   	UserClass1  rH   r   c                   @   rE   )z(GCTests.test_is_tracked.<locals>.UserIntNrF   r   r   r   r   UserInt4  rH   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   )
assertFalser9   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   rt   S     z2GCTests.test_is_finalized.<locals>.Lazarus.__del__Nru   r   r   r   r   LazarusR      r   )r   r9   Zis_finalizedr:   rm   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>rB   c                    s   g | ]}t | qS r   )r+   r,   )r   r   )r   r   r   r   g      r   )r   r9   r:   r;   rl   )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                   @   rE   )z GCTests.test_bug21435.<locals>.ANrF   r   r   r   r   rG     rH   rG   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   rt     r)   z(GCTests.test_bug21435.<locals>.B.__del__N)r   r   r   r"   rt   r   r   r   r   rQ     r   rQ   c                     s      }   }|| _ | |_ d S r   r   )rJ   r[   rG   rQ   r   r   do_work  s   

z&GCTests.test_bug21435.<locals>.do_work)r9   r:   )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       )
Popenre   
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 )Nzif 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 )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
   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 )Nzif 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   >   uncollectable	collectedcollectionsr  r   r  r  r6   rB   )r9   	get_statsr;   rl   assertIsInstancedictr   ZassertGreaterEqual	isenabledr  rw   ry   r:   )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   )r9   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'  r6   c                 3   r"  r   r   r#  r%  r   r   r&  !  r'  rB   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'  )r9   r:   r8   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?)r9   r:   r;   rl   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   rG   O  r   rG   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 r5   )resurrectedresurrected_instancesr8   r'   r   r   r   rt   W  s   zOGCTests.test_resurrection_only_happens_once_per_object.<locals>.Lazarus.__del__N)r   r   r   r3  r4  rt   r   r5  r   r   r   S  s    r   r   r6   )	r9   r:   ry   r;   r3  rl   r4  clearrw   )r!   rG   lazr   r5  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   r0  r   r1  r'   r   r   r   r"   t  r)   z?GCTests.test_resurrection_is_transitive.<locals>.Cargo.__init__Nr#   r   r   r   r   Cargos  r   r9  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   )r4  r8   r'   r5  r   r   rt   z  s   z@GCTests.test_resurrection_is_transitive.<locals>.Lazarus.__del__N)r   r   r   r4  rt   r   r5  r   r   r   w  s    r   r6   cargo)r9   r:   ry   rZ   r:  r7  r;   rl   r4  rm   r   hasattrrw   )r!   r9  r7  r:  Zcargo_idinstancer   r5  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 )Nd   c                   @   r   )zLGCTests.test_resurrection_does_not_block_cleanup_of_other_objects.<locals>.Ac                 S   r0  r   r1  r'   r   r   r   r"     r)   zUGCTests.test_resurrection_does_not_block_cleanup_of_other_objects.<locals>.A.__init__Nr#   r   r   r   r   rG     r   rG   c                       r   )zLGCTests.test_resurrection_does_not_block_cleanup_of_other_objects.<locals>.Zc                    r   r   r   r'   Zzsr   r   rt     r   zTGCTests.test_resurrection_does_not_block_cleanup_of_other_objects.<locals>.Z.__del__Nru   r   r?  r   r   Z  r   r@  c                  S   s   t  d } | d | d fS )Nr  r  )r9   r  )r@   r   r   r   getstats  r   zSGCTests.test_resurrection_does_not_block_cleanup_of_other_objects.<locals>.getstatsrB   r   r   )r9   r:   ry   r   r;   r6  rw   )r!   r   rG   r@  rB  ZoldcZoldncr   rC   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)rJ   ywzNr   r   r   r   r   rG     r   rG   c                   @   rE   )z+GCTests.test_trash_weakref_clear.<locals>.ZNrF   r   r   r   r   r@    rH   r@  )unittestZmockZMockrJ   r   rD  r+   r,   valuerE  r8   r9   r:   ry   Zassert_not_calledrw   )r!   r   rG   r@  rJ   Zwr_cycler   r   r   test_trash_weakref_clear  s   
 
z GCTests.test_trash_weakref_clear)0r   r   r   r=   rA   rD   rM   rN   rP   rS   rU   r   ra   rb   rd   r   ri   rp   r{   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r   r!  r,  r/  r8  r=  rC  rF  skipIfr   rH  r   r   r   r   r4   V   sd    
	


	


#:/ 
0.
$"
Cr4   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   )r9   r  enabledry   rj   ro   rk   	callbacksr8   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   )visitr9   rL  r^   rM  rN  rk   ro   rK  rw   r:   r\   
isinstancer.   r/   rO  )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   )rQ  r9   r:   r\   rO  r8   )r!   r\   r   r   r   preclean/  s
   
zGCCallbackTests.precleanc                 C   s   | j d|t|f d S r5   )rQ  r8   r  )r!   phaseinfor   r   r   rM  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 )NrB   stopcleanupc                 S   s   g | ]	}t |tr|qS r   rR  r.   r   r   r   r   r   r   @  s    z'GCCallbackTests.cb2.<locals>.<listcomp>c                 S   s   g | ]	}t |ts|qS r   rY  rZ  r   r   r   r   A  s    
)rQ  r8   r  r;  r9   r\   r/   )r!   rU  rV  Zucr   r   r   r   rN  <  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 r6   r   r   r   r   r   r   N  r   c                 S   r]  )rB   r   r   r   r   r   r   O  r   r6   rB   c                 S   r[  r^  r   r\  r   r   r   r   T  r   c                 S   r]  )startr   r   r   r   r   r   U  r   c                 S   r]  )rW  r   r   r   r   r   r   V  r   r_  rW  r)  r  r  )rT  r9   r:   rQ  r;   r   )r!   r   Zn1Zn2r   rV  r   r   r   test_collectF  s$   
zGCCallbackTests.test_collectc                 C   s:   |    td | jD ]}|d }| |d d qd S )NrB   r)  )rT  r9   r:   rQ  r;   )r!   r   rV  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*   r6   rW  rB   r  r     r   Tr   )rT  r.   r   r9   r:   rQ  r;   rl   r\   r  rX  )r!   r   rV  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\])rT  r   r  textwrapdedentr   re   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   rP  rS  rT  rM  rN  r`  ra  r   rc  rF  rI  BUILD_WITH_NDEBUGrf  r   r   r   r   rJ    s    



$rJ  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   )r9   rw   r'   r   r   r   rP    rT   zGCTogglingTests.setUpc                 C   ri  r   )r9   ry   r'   r   r   r   rS    rT   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   r6   rB   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   r9   r:   Zkeep_c0_aliver    r+   r,   r$   r%   r]   r;   rl   r8   )
r!   Zc0c1c2r   Zc0wrjunkr   detectorr   r   rk  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                    rj  r   r   r'   rk  r   r   rt     rl  z3GCTogglingTests.test_bug1055820d.<locals>.D.__del__Nru   r   rk  r   r   D  s    rt  r   r6   rB   rm  rn  )r   r9   r:   Zkeep_d0_aliver    r+   r,   r$   r%   r]   r;   rl   r8   )	r!   rt  Zd0ro  rp  rr  rq  r   r   r   rk  r   test_bug1055820d  s0   


z GCTogglingTests.test_bug1055820dN)r   r   r   rP  rS  rs  ru  r   r   r   r   rh    s
    Frh  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   )rd  re  r
   )r!   r  r   r   r   test_ast_finiV  s   
z%PythonFinalizationTests.test_ast_finiN)r   r   r   rw  r   r   r   r   rv  U  r   rv  c               	   C   s   t  } t   t  rJ t  }t |t j @  z+t   ttt	t
t W t | tr3td t   t  s=J | sEt   d S d S t | trRtd t   t  s\J | sct   w w )Nzrestoring automatic collection)r9   r  ry   rj   rk   Z
DEBUG_LEAKr:   r   r4   rJ  rh  rv  r   printrw   )rK  ro   r   r   r   	test_mainp  s:   


ry  __main__)+rF  Zunittest.mockZtest.supportr   r   r   r   Ztest.support.import_helperr   Ztest.support.os_helperr   r   r	   Ztest.support.script_helperr
   r   r   r9   re   Z	sysconfigrd  r   r   r+   Z	_testcapir   ImportErrorr   r   r   r$   r.   Zget_config_varsgetrg  r;  ZTestCaser4   rJ  rh  rv  ry  r   r   r   r   r   <module>   s`           D 2 
