
    <e                        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	 d dlmZ n# e$ r d ZY nw xY w	 d d	lmZ n# e$ r dZY nw xY w G d
 de          Z G d de          Ze G d de                      Z ej                     !                    dd          rd ej                     d         v Z"n e#ed           Z" G d de j$                  Z% G d de j$                  Z& G d de j$                  Z' G d de j$                  Z(d Z)d Z*e+dk    r e j,                     dS dS )    N)verboserefcount_testcpython_onlyrequires_subprocess)import_module)temp_dirTESTFNunlink)assert_python_okmake_script)threading_helper)with_tp_delc                 ,     G d dt                     }|S )Nc                       e Zd Zd ZdS )with_tp_del.<locals>.Cc                      t          d          )Nzrequires _testcapi.with_tp_del)	TypeError)clsargskwargss      #/usr/lib/python3.11/test/test_gc.py__new__zwith_tp_del.<locals>.C.__new__   s     @AAA    N)__name__
__module____qualname__r    r   r   Cr      s(        B B B B Br   r   )object)r   r   s     r   r   r      s;    	B 	B 	B 	B 	B 	B 	B 	B r   )ContainerNoGCc                       e Zd Zd ZdS )C1055820c                 "    || _         | | _        d S N)iloop)selfr%   s     r   __init__zC1055820.__init__)   s    			r   Nr   r   r   r(   r   r   r   r"   r"   (   s#            r   r"   c                       e Zd Zd ZdS )GC_Detectorc                 n     d _          fd}t          j        t          d          |           _        d S )NFc                     d_         d S )NT)gc_happened)ignoredr'   s    r   it_happenedz)GC_Detector.__init__.<locals>.it_happened4   s    #Dr     )r.   weakrefrefr"   wr)r'   r0   s   ` r   r(   zGC_Detector.__init__1   sC     	$ 	$ 	$ 	$ 	$
 +hsmm[99r   Nr)   r   r   r   r+   r+   -   s#        : : : : :r   r+   c                        e Zd ZdZddZ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                 F    |t          |           | _        d S || _        d S )N)partner)r6   r8   )r'   r8   s     r   r(   zUncollectable.__init__C   s(    ?(666DLLL"DLLLr   c                     d S r$   r   r'   s    r   
__tp_del__zUncollectable.__tp_del__H   s    r   r$   )r   r   r   __doc__r(   r;   r   r   r   r6   r6   ;   sA        ) )# # # #
    r   r6   	PY_CFLAGS z-DNDEBUGgettotalrefcountc                      e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
ed	             Zed
             Zd Zd Zed             Zd Zd Zd Zed             Zed             Zd Z ej                    d             Zd Zd Zd Zd Zd Zd Z d Z!d Z"d Z#e e$            d                         Z%d Z&d  Z'd! Z(d" Z)d# Z*d$ Z+d% Z,d& Z-d' Z.d( Z/ e0j1        e2d)u d*          d+             Z3d)S ),GCTestsc                     g }|                     |           t          j                     ~|                     t          j                    d           d S N   appendgccollectassertEqualr'   ls     r   	test_listzGCTests.test_listW   sF    	

q)))))r   c                     i }||d<   t          j                     ~|                     t          j                    d           d S rC   rG   rH   rI   r'   ds     r   	test_dictzGCTests.test_dict^   s@    !

q)))))r   c                     g }|f}|                     |           t          j                     ~~|                     t          j                    d           d S )N   rE   )r'   rK   ts      r   
test_tuplezGCTests.test_tuplee   sP    D	

q)))))r   c                      G d d          }||_         t          j                     ~|                     t          j                    d           d S )Nc                       e Zd ZdS )GCTests.test_class.<locals>.ANr   r   r   r   r   r   ArX   p           Dr   rZ   r   arG   rH   assertNotEqualr'   rZ   s     r   
test_classzGCTests.test_classo   sa    	 	 	 	 	 	 	 	

BJLL!,,,,,r   c                      G d dt                     }t          j                     ~|                     t          j                    d           d S )Nc                       e Zd ZdS )%GCTests.test_newstyleclass.<locals>.ANrY   r   r   r   rZ   rc   x   r[   r   rZ   r   )r   rG   rH   r^   r_   s     r   test_newstyleclasszGCTests.test_newstyleclassw   s\    	 	 	 	 	 	 	 	

BJLL!,,,,,r   c                      G d d          } |            }||_         t          j                     ~|                     t          j                    d           d S )Nc                       e Zd ZdS ) GCTests.test_instance.<locals>.ANrY   r   r   r   rZ   rg      r[   r   rZ   r   r\   r'   rZ   r]   s      r   test_instancezGCTests.test_instance~   sl    	 	 	 	 	 	 	 	ACC

BJLL!,,,,,r   c                     G d dt                     } |            }||_        t          j                     ~|                     t          j                    d            G d dt
                    } G d d||          } |            }||_        t          j                     ~|                     t          j                    d           ~~|                     t          j                    d            |            |_        ~|                     t          j                    d           |                     t          j                    d           d S )Nc                       e Zd ZdS )#GCTests.test_newinstance.<locals>.ANrY   r   r   r   rZ   rl      r[   r   rZ   r   c                       e Zd ZdS )#GCTests.test_newinstance.<locals>.BNrY   r   r   r   Brn      r[   r   ro   c                       e Zd ZdS )#GCTests.test_newinstance.<locals>.CNrY   r   r   r   r   rq      r[   r   r   )r   r]   rG   rH   r^   listrI   )r'   rZ   r]   ro   r   s        r   test_newinstancezGCTests.test_newinstance   si   	 	 	 	 	 	 	 	ACC

BJLL!,,,	 	 	 	 	 	 	 		 	 	 	 	1 	 	 	ACC

BJLL!,,,qBJLL!,,,accBJLL!,,,q)))))r   c                      G d d          } |            }t          j                     ~|                     t          j                    d           d S )Nc                       e Zd Zd ZdS )GCTests.test_method.<locals>.Ac                     | j         | _        d S r$   )r(   initr:   s    r   r(   z'GCTests.test_method.<locals>.A.__init__   s     M			r   Nr)   r   r   r   rZ   rv      s#        * * * * *r   rZ   r   )rG   rH   r^   rh   s      r   test_methodzGCTests.test_method   sg    	* 	* 	* 	* 	* 	* 	* 	* ACC

BJLL!,,,,,r   c                    t            G d d                      } G d d          } |            }||_        t          |          } |            }||_        t	          j                     ~~|                     t	          j                    d           t          j        D ]}t          |          |k    r|` n|                     d           t          j        	                    |           d S )Nc                       e Zd Zd ZdS )(GCTests.test_legacy_finalizer.<locals>.Ac                     d S r$   r   r:   s    r   r;   z3GCTests.test_legacy_finalizer.<locals>.A.__tp_del__         r   Nr   r   r   r;   r   r   r   rZ   r|              &&&&&r   rZ   c                       e Zd ZdS )(GCTests.test_legacy_finalizer.<locals>.BNrY   r   r   r   ro   r      r[   r   ro   r   &didn't find obj in garbage (finalizer))
r   r]   idbrG   rH   r^   garbagefailremover'   rZ   ro   r]   id_ar   objs          r   test_legacy_finalizerzGCTests.test_legacy_finalizer   s    
	' 	' 	' 	' 	' 	' 	' 
	'	 	 	 	 	 	 	 	ACC!uuACC

BJLL!,,,: 	@ 	@C#ww$E  II>???

#r   c                    t            G d dt                                } G d dt                    } |            }||_        t          |          } |            }||_        t          j                     ~~|                     t          j                    d           t
          j        D ]}t          |          |k    r|` n| 	                    d           t
          j        
                    |           d S )Nc                       e Zd Zd ZdS )1GCTests.test_legacy_finalizer_newclass.<locals>.Ac                     d S r$   r   r:   s    r   r;   z<GCTests.test_legacy_finalizer_newclass.<locals>.A.__tp_del__   r~   r   Nr   r   r   r   rZ   r      r   r   rZ   c                       e Zd ZdS )1GCTests.test_legacy_finalizer_newclass.<locals>.BNrY   r   r   r   ro   r      r[   r   ro   r   r   )r   r   r]   r   r   rG   rH   r^   r   r   r   r   s          r   test_legacy_finalizer_newclassz&GCTests.test_legacy_finalizer_newclass   s     
	' 	' 	' 	' 	' 	' 	' 
	'	 	 	 	 	 	 	 	ACC!uuACC

BJLL!,,,: 	@ 	@C#ww$E  II>???

#r   c                     i }t          d|           t          j                     ~|                     t          j                    d           d S )Nzdef f(): pass
rS   )execrG   rH   rI   rO   s     r   test_functionzGCTests.test_function   sJ     """

q)))))r   c                     d}t          d|          \  }}}|                     |d           |                     |d           |                     |           d S )Na  if 1:

        import gc
        import weakref

        class LateFin:
            __slots__ = ('ref',)

            def __del__(self):

                # 8. Now `latefin`'s finalizer is called. Here we
                #    obtain a reference to `func`, which is currently
                #    undergoing `tp_clear`.
                global func
                func = self.ref()

        class Cyclic(tuple):
            __slots__ = ()

            # 4. The finalizers of all garbage objects are called. In
            #    this case this is only us as `func` doesn't have a
            #    finalizer.
            def __del__(self):

                # 5. Create a weakref to `func` now. If we had created
                #    it earlier, it would have been cleared by the
                #    garbage collector before calling the finalizers.
                self[1].ref = weakref.ref(self[0])

                # 6. Drop the global reference to `latefin`. The only
                #    remaining reference is the one we have.
                global latefin
                del latefin

            # 7. Now `func` is `tp_clear`-ed. This drops the last
            #    reference to `Cyclic`, which gets `tp_dealloc`-ed.
            #    This drops the last reference to `latefin`.

        latefin = LateFin()
        def func():
            pass
        cyc = tuple.__new__(Cyclic, (func, latefin))

        # 1. Create a reference cycle of `cyc` and `func`.
        func.__module__ = cyc

        # 2. Make the cycle unreachable, but keep the global reference
        #    to `latefin` so that it isn't detected as garbage. This
        #    way its finalizer will not be called immediately.
        del func, cyc

        # 3. Invoke garbage collection,
        #    which will find `cyc` and `func` as garbage.
        gc.collect()

        # 9. Previously, this would crash because `func_qualname`
        #    had been NULL-ed out by func_clear().
        print(f"{func=}")
        -cr   s!   \A\s*func=<function  at \S+>\s*\Z)r   rI   assertRegexassertFalse)r'   codercstdoutstderrs        r   .test_function_tp_clear_leaves_consistent_statez6GCTests.test_function_tp_clear_leaves_consistent_state   si    :x .dD99FFQ!JKKK     r   c                     d }t          j                      |             |                     t          j                    d           d S )Nc                  ,    t          j                    } d S r$   )sys	_getframe)frames    r   fzGCTests.test_frame.<locals>.f+  s    MOOEEEr   rD   rN   )r'   r   s     r   
test_framezGCTests.test_frame)  sI    	$ 	$ 	$

	q)))))r   c                 L   t          j                     |                     t           j        g            g }|                    |           t          |          }t          j                    }t          j        |t           j        z             ~t          j                     t          j        |           |                     t          t           j                  d           t           j        
                                }|                     t          |          |           d S rC   )rG   rH   rI   r   rF   r   	get_debug	set_debugDEBUG_SAVEALLlenpop)r'   Lid_Ldebugr   s        r   test_saveallzGCTests.test_saveall1  s     	
R(((	!uu
UR--...


URZ!,,,jnnC$'''''r   c                     t          j                    }t          j                     t          j        d            G d d          } |            }~t          j                     t          j        |  d S )NrD   c                       e Zd Zd ZdS )GCTests.test_del.<locals>.Ac                 $    t          |            d S r$   dirr:   s    r   __del__z#GCTests.test_del.<locals>.A.__del__P      D					r   Nr   r   r   r   r   r   r   rZ   r   O  #            r   rZ   )rG   get_thresholdenableset_thresholddisabler'   
thresholdsrZ   r]   s       r   test_delzGCTests.test_delI  s    %''

	
	 	 	 	 	 	 	 	 ACC


*%%%%r   c                     t          j                    }t          j                     t          j        d            G d dt                    } |            }~t          j                     t          j        |  d S )NrD   c                       e Zd Zd ZdS )$GCTests.test_del_newclass.<locals>.Ac                 $    t          |            d S r$   r   r:   s    r   r   z,GCTests.test_del_newclass.<locals>.A.__del___  r   r   Nr   r   r   r   rZ   r   ^  r   r   rZ   )rG   r   r   r   r   r   r   s       r   test_del_newclasszGCTests.test_del_newclassX  s    %''

	
	 	 	 	 	 	 	 	 ACC


*%%%%r   c                 D   t          j                     t          j                    \  }}}g }t          j                    \  }}}|                     ||fd           |                     ||fd           |                     |d           |                     ||           d S )Nr   r      )rG   rH   	get_countrI   
assertLessassertGreater)r'   r]   r   cxrP   er   s           r   test_get_countzGCTests.test_get_countm  s    

,..1a,..1a!Q(((!Q(((1 	1a     r   c                    t          j                     g }t          j        d           t          j                    \  }}}t          j        d           t          j                    \  }}}t          j        d           t          j                    \  }}	}
|                     ||fd           |                     ||fd           |                     |	|
fd           d S )Nr   rD   rS   )rD   r   )r   rD   r   )rG   rH   r   rI   )r'   r   r]   r   r   rP   r   r   ghr%   s              r   test_collect_generationsz GCTests.test_collect_generations{  s    

 

1,..1a

1,..1a

1,..1a 	!Q(((!Q(((!Q(((((r   c                 \    G fdd          t          j                     d}t          d          D ]c}g }t          |          D ]}|             g}g }t          |          D ]}|             g}i }t          |          D ]}|             d}dt          j                     d S )Nc                       e Zd ZdZ fdZdS )#GCTests.test_trashcan.<locals>.Ouchr   c                 l    j         dz   _         j         dz  dk    rt          j                     d S d S )NrD      r   )nrG   rH   )r'   Ouchs    r   r   z+GCTests.test_trashcan.<locals>.Ouch.__del__  s8    !6B;!##JLLLLL $#r   N)r   r   r   r   r   )r   s   r   r   r     s3        A! ! ! ! ! ! !r   r      rS   )rD   rS   )rG   r   ranger   )r'   NcountrT   r%   uvr   s          @r   test_trashcanzGCTests.test_trashcan  s    	! 	! 	! 	! 	! 	! 	! 	! 	! 	!( 		1XX 		& 		&EA1XX    KA1XX    KA1XX & &ddff%%&

r   c                   	
 dd}d  G fddt                     fd
	
fd}t          j                    }t          j        d           	 g 	g }t	          |          D ],}t          j        |	          }|                    |           -t          j	        |	fd
          5  t          j        d           d d d            n# 1 swxY w Y   t          j        |           n# t          j        |           w xY wt          j                     |                     t          j                  t          j                             d S )N<   rS   c               3   n   K   	 dV  t          j        d           dS # t          j        d           w xY w)z<A generator that releases the GIL when closed or dealloc'ed.Ngư>)timesleepr   r   r   sleeper_genz2GCTests.test_trashcan_threads.<locals>.sleeper_gen  s@      %
8$$$$$
8$$$$s    4c                   .    e Zd Zg Zg Z fdZ fdZdS )(GCTests.test_trashcan_threads.<locals>.Cc                 J    || d d <   j                             d            d S r$   )initsrF   )r'   alistr   s     r   r(   z1GCTests.test_trashcan_threads.<locals>.C.__init__  s*    QQQt$$$$$r   c                 n    j                             d                         }t          |           d S r$   )delsrF   next)r'   r   r   r   s     r   r   z0GCTests.test_trashcan_threads.<locals>.C.__del__  s3    d###  KMMQr   N)r   r   r   r   r   r(   r   )r   r   s   r   r   r     sV        ED% % % % %       r   r   c                  ^     g           } t                    D ]} | g          g} ~ dS )zyCreate a sufficiently nested container object so that the
            trashcan mechanism is invoked when deallocating it.N)r   )r   r%   r   NESTINGs     r   make_nestedz2GCTests.test_trashcan_threads.<locals>.make_nested  sA     "A7^^  QsVVHr   c                  (     s               dS dS )z!Exercise make_nested() in a loop.Nr   )exitr   s   r   
run_threadz1GCTests.test_trashcan_threads.<locals>.run_thread  s4           r   gh㈵>)targetc                  .                          d          S rC   rF   )r   s   r   <lambda>z/GCTests.test_trashcan_threads.<locals>.<lambda>  s    Q r         ?)rr   r   getswitchintervalsetswitchintervalr   	threadingThreadrF   r   start_threadsr   r   rG   rH   rI   r   r   r   )r'   	N_THREADSr   old_switchintervalthreadsr%   rT   r   r   r   r   r   s          @@@@@r   test_trashcan_threadszGCTests.test_trashcan_threads  s    		% 	% 	%	 	 	 	 	 	 	 	 	 	 	$	 	 	 	 	 		 	 	 	 	 	
 !244d###		6DG9%% " "$J777q!!!!!/9O9O9O9OPP    
3                              !"45555C!"45555

QWs16{{33333s1   AC0 /CC0 CC0 CC0 0Dc                 h    G d d          } |            } |            }||_         ||_         t          j                     t          t          j                  }~~|                     t          j                    d           |                     t          t          j                  |           d S )Nc                       e Zd Zd ZdS )GCTests.test_boom.<locals>.Boomc                     | ` t          r$   attrAttributeErrorr'   someattributes     r   __getattr__z+GCTests.test_boom.<locals>.Boom.__getattr__      I$$r   Nr   r   r   r  r   r   r   Boomr    #        % % % % %r   r  rS   r
  rG   rH   r   r   rI   )r'   r  r]   r   
garbagelens        r   	test_boomzGCTests.test_boom  s    	% 	% 	% 	% 	% 	% 	% 	%
 DFFDFF

__
q 	q)))RZ*55555r   c                 h    G d d          } |            } |            }||_         ||_         t          j                     t          t          j                  }~~|                     t          j                    d           |                     t          t          j                  |           d S )Nc                       e Zd Zd Zd ZdS )!GCTests.test_boom2.<locals>.Boom2c                     d| _         d S Nr   r   r:   s    r   r(   z*GCTests.test_boom2.<locals>.Boom2.__init__      r   c                 J    | xj         dz  c_         | j         dk    r| `t          rC   r   r
  r  r  s     r   r  z-GCTests.test_boom2.<locals>.Boom2.__getattr__  '    !6A::	$$r   Nr   r   r   r(   r  r   r   r   Boom2r    2          % % % % %r   r!  rS   r  )r'   r!  r]   r   r  s        r   
test_boom2zGCTests.test_boom2  s    	% 	% 	% 	% 	% 	% 	% 	% EGGEGG

__
q 	q)))RZ*55555r   c                 t    G d dt                     } |            } |            }||_        ||_        t          j                     t	          t          j                  }~~|                     t          j                    d           |                     t	          t          j                  |           d S )Nc                       e Zd Zd ZdS )'GCTests.test_boom_new.<locals>.Boom_Newc                     | ` t          r$   r	  r  s     r   r  z3GCTests.test_boom_new.<locals>.Boom_New.__getattr__&  r  r   Nr  r   r   r   Boom_Newr&  %  r  r   r(  rS   r   r
  rG   rH   r   r   rI   )r'   r(  r]   r   r  s        r   test_boom_newzGCTests.test_boom_new!  s    	% 	% 	% 	% 	%v 	% 	% 	%
 HJJHJJ

__
qq)))RZ*55555r   c                 t    G d dt                     } |            } |            }||_        ||_        t          j                     t	          t          j                  }~~|                     t          j                    d           |                     t	          t          j                  |           d S )Nc                       e Zd Zd Zd ZdS ))GCTests.test_boom2_new.<locals>.Boom2_Newc                     d| _         d S r  r  r:   s    r   r(   z2GCTests.test_boom2_new.<locals>.Boom2_New.__init__7  r  r   c                 J    | xj         dz  c_         | j         dk    r| `t          rC   r  r  s     r   r  z5GCTests.test_boom2_new.<locals>.Boom2_New.__getattr__:  r  r   Nr   r   r   r   	Boom2_Newr-  6  r"  r   r0  rS   r)  )r'   r0  r]   r   r  s        r   test_boom2_newzGCTests.test_boom2_new5  s    	% 	% 	% 	% 	% 	% 	% 	% IKKIKK

__
qq)))RZ*55555r   c           	         g d}t          j        |          }|                                 |                     ||           t	          |          }t          j        |          }|                                 |                     ||           ddd}g d}t          j        |          }|                                 |                     ||           t          j        ddgddid	          }|                                 |                     |d
d
gt          t          d                    z              |                     t          j        ddd          g            d S )N)rD      r   r3     )rD   r   )rD   r3  r   r4  rD   rS      )r   r   r   r   r   r]   y              @)rG   get_referentssortrI   tuplerr   r   )r'   r   gotatupleadictexpecteds         r   test_get_referentszGCTests.test_get_referentsK  sB   		u%%


e$$$uv&&


e$$$!<<u%%


h'''1v1vy99


q!ftE!HH~~5666)!S"55r:::::r   c                 "   |                      t          j        d                      |                      t          j        d                     |                      t          j        d                     |                      t          j        d                     |                      t          j        d                     |                      t          j        d                     |                      t          j        d                     |                      t          j        d                     |                      t          j        t          d                               |                      t          j        t                               |                      t          j        t
                               |                      t          j        t                               |                      t          j        t                                            G d d	          } G d
 dt
                    } G d d          } G d dt                    } G d dt
                    }|                     t          j        t                               |                     t          j        |                     |                     t          j         |                                 |                     t          j         |                                 |                     t          j        g                      |                     t          j        t                                           |                     t          j         |                                 |                     t          j         |                                 |                     t          j         |                                 d S )NrD   r   y      ?      @TF   ar]   c                       e Zd ZdS )*GCTests.test_is_tracked.<locals>.UserClassNrY   r   r   r   	UserClassrA  u  r[   r   rB  c                       e Zd ZdS )(GCTests.test_is_tracked.<locals>.UserIntNrY   r   r   r   UserIntrD  x  r[   r   rE  c                       e Zd ZdZdS )/GCTests.test_is_tracked.<locals>.UserClassSlotsr   Nr   r   r   	__slots__r   r   r   UserClassSlotsrG  |          IIIr   rJ  c                       e Zd ZdZdS )/GCTests.test_is_tracked.<locals>.UserFloatSlotsr   NrH  r   r   r   UserFloatSlotsrM    rK  r   rN  c                       e Zd ZdZdS )-GCTests.test_is_tracked.<locals>.UserIntSlotsr   NrH  r   r   r   UserIntSlotsrP    rK  r   rQ  )
r   rG   
is_tracked	bytearraytypeintr   float
assertTrueset)r'   rB  rE  rJ  rN  rQ  s         r   test_is_trackedzGCTests.test_is_trackedb  s   
 	t,,---q))***s++,,,z22333t,,---u--...t,,---s++,,,y77888t,,---s++,,,v..///vxx00111	 	 	 	 	 	 	 		 	 	 	 	c 	 	 		 	 	 	 	 	 	 		 	 	 	 	U 	 	 		 	 	 	 	3 	 	 	 	b))***i00111iikk22333ggii00111b))***cee,,---nn&6&677888nn&6&677888llnn5566666r   c                 x   |                      t          j        d                     g  G fdd          } |            }|                      t          j        |                     ~t          j                                                     }|                     t          j        |                     d S )Nr3  c                       e Zd Z fdZdS )*GCTests.test_is_finalized.<locals>.Lazarusc                 2                         |            d S r$   r   )r'   storages    r   r   z2GCTests.test_is_finalized.<locals>.Lazarus.__del__  s    t$$$$$r   Nr   )r^  s   r   Lazarusr\    s.        % % % % % % %r   r_  )r   rG   is_finalizedrH   r   rW  )r'   r_  lazarusr^  s      @r   test_is_finalizedzGCTests.test_is_finalized  s    ++,,,	% 	% 	% 	% 	% 	% 	% 	% 	% 	% '))11222

++--0011111r   c                    g fdd t          d          D             }fd|D             d }t          j                     |                     t	                    d           d }t          j                     |                     t	                    d           D ]}|                     |d            d S )Nc                 *    d D             d d <   d S )Nc                 "    g | ]} |            S r   r   ).0r4   s     r   
<listcomp>z>GCTests.test_bug1055820b.<locals>.callback.<locals>.<listcomp>  s    ***rrtt***r   r   )r/   WRsouchs    r   callbackz*GCTests.test_bug1055820b.<locals>.callback  s"    **c***DGGGr   c                 ,    g | ]}t          |          S r   )r"   rf  r%   s     r   rg  z,GCTests.test_bug1055820b.<locals>.<listcomp>  s    ,,,ahqkk,,,r   rS   c                 :    g | ]}t          j        |          S r   )r2   r3   )rf  r   rj  s     r   rg  z,GCTests.test_bug1055820b.<locals>.<listcomp>  s%    444Aw{1h''444r   r   )r   rG   rH   rI   r   )r'   Csr   r   rh  rj  ri  s       @@@r   test_bug1055820bzGCTests.test_bug1055820b  s     	+ 	+ 	+ 	+ 	+ 	+ -,588,,,4444444

TA&&& 

TA&&& 	& 	&A Q%%%%	& 	&r   c                     t          j                      G d d           G d d          fd} |             t          j                     d S )Nc                       e Zd ZdS ) GCTests.test_bug21435.<locals>.ANrY   r   r   r   rZ   rr    r[   r   rZ   c                       e Zd Zd Zd ZdS ) GCTests.test_bug21435.<locals>.Bc                     || _         d S r$   r  )r'   r   s     r   r(   z)GCTests.test_bug21435.<locals>.B.__init__  r  r   c                     d | _         d S r$   r
  r:   s    r   r   z(GCTests.test_bug21435.<locals>.B.__del__  s     			r   N)r   r   r   r(   r   r   r   r   ro   rt    s2          ! ! ! ! !r   ro   c                  ^                 }                         }|| _         | |_         d S r$   rw  )r]   r   rZ   ro   s     r   do_workz&GCTests.test_bug21435.<locals>.do_work  s3    A!!##AAFAFFFr   )rG   rH   )r'   ry  rZ   ro   s     @@r   test_bug21435zGCTests.test_bug21435  s     	
	 	 	 	 	 	 	 		! 	! 	! 	! 	! 	! 	! 	!	 	 	 	 	 	 				

r   c                 ^    dd l d} fd} ||dz            }                     d|                                d|            ||dz            }                     d|                                d	|v pd
|v |            ||dz            }                     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                 \                        t          j        dd| gj        j                  }|                                \  }}|j                                         |j                                                             |j	        d                               |d           |S )Nz-Wdr   r   r   r   r   )
Popenr   
executablePIPEcommunicater   closer   rI   
returncode)r   pr   r   r'   
subprocesss       r   run_commandz5GCTests.test_garbage_at_shutdown.<locals>.run_command  s      #.%t!D!! ! ( (A ]]__NFFHNNHNNQ\1---VS)))Mr   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  assertInassertNotInrW  )r'   r   r  r   r  s   `   @r   test_garbage_at_shutdownz GCTests.test_garbage_at_shutdown  s    	$		 		 		 		 		 		 TCZ(( '(.	0 	0 	0000T$<<== "#)	+ 	+ 	++v5 7+v5	@ 	@ 	@ T$6677=vFFFFFr   c                     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   rI   strip)r'   r   r   outerrs        r   test_gc_main_module_at_shutdownz'GCTests.test_gc_main_module_at_shutdown  sE     (d33C&788888r   c                     t                      5 }d}d|d}t          |d|           t          d|          \  }}}|                     |                                d           d d d            d S # 1 swxY w Y   d S )Nzif 1:
                class C:
                    def __del__(self):
                        print('__del__ called')
                l = [C()]
                l.append(l)
                zDif 1:
                import sys
                sys.path.insert(0, z0)
                import gctest
                gctestr   r  )r   r   r   rI   r  )r'   
script_dirmoduler   r   r  r  s          r   #test_gc_ordinary_module_at_shutdownz+GCTests.test_gc_ordinary_module_at_shutdown  s    ZZ 	=:FF "zz	$D
 
Hf555+D$77LBSSYY[[*;<<<	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	=s   AA22A69A6c                 R   d}|                      t          t                     t          t          dd          5 }|                    |           d d d            n# 1 swxY 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   rI   r  )r'   r   scriptr   r  r  s         r   test_global_del_SystemExitz"GCTests.test_global_del_SystemExit-  s    # 	'''&#000 	FLL	 	 	 	 	 	 	 	 	 	 	 	 	 	 	'//C&788888s   AA #A c                 *   t          j                    }|                     t          |          d           |D ]}|                     |t
                     |                     t          |          h d           |                     |d         d           |                     |d         d           |                     |d         d           t          j                    r2| 	                    t           j
                   t          j                     t          j                    }t          j        d           t          j                    }|                     |d         d         |d         d         dz              |                     |d         d         |d         d                    |                     |d         d         |d         d                    t          j        d           t          j                    }|                     |d         d         |d         d         dz              |                     |d         d         |d         d                    |                     |d         d         |d         d         dz              d S )	Nr3  >   	collectedcollectionsuncollectabler  r   r  r  rD   rS   )rG   	get_statsrI   r   assertIsInstancedictrX  assertGreaterEqual	isenabledr  r   r   rH   )r'   statsstoldnews        r   test_get_statszGCTests.test_get_stats;  s:   UQ''' 	< 	<B!!"d+++SWWJJJL L L##B{OQ777##B}$5q999##B$7;;;;<>> 	OOBI&&&JLLLlnn

1lnnQ.A}0E0IJJJQ.A}0EFFFQ.A}0EFFF

1lnnQ.A}0E0IJJJQ.A}0EFFFQ.A}0E0IJJJJJr   c                     t          j                     |                     t          j                    d           t          j                     |                     t          j                    d           d S r  )rG   freezer   get_freeze_countunfreezerI   r:   s    r   test_freezezGCTests.test_freezeU  s\    
	2.00!444
,..22222r   c                    t          j                     g                                |                     t	          fdt          j        d          D                                  |                     t	          fdt          j        d          D                                  |                     t	          fdt          j        d          D                                  t          j        d           |                     t	          fdt          j        d          D                                  |                     t	          fd	t          j        d          D                                  |                     t	          fd
t          j        d          D                                  t          j        d           |                     t	          fdt          j        d          D                                  |                     t	          fdt          j        d          D                                  |                     t	          fdt          j        d          D                                  t          j        d           |                     t	          fdt          j        d          D                                  |                     t	          fdt          j        d          D                                  |                     t	          fdt          j        d          D                                  t          j                     d S )Nc              3       K   | ]}|u V  	d S r$   r   rf  elementrK   s     r   	<genexpr>z+GCTests.test_get_objects.<locals>.<genexpr>`  '      MMWALMMMMMMr   r   
generationc              3       K   | ]}|u V  	d S r$   r   r  s     r   r  z+GCTests.test_get_objects.<locals>.<genexpr>c  '      NNWALNNNNNNr   rD   c              3       K   | ]}|u V  	d S r$   r   r  s     r   r  z+GCTests.test_get_objects.<locals>.<genexpr>f  r  r   rS   c              3       K   | ]}|u V  	d S r$   r   r  s     r   r  z+GCTests.test_get_objects.<locals>.<genexpr>j  r  r   c              3       K   | ]}|u V  	d S r$   r   r  s     r   r  z+GCTests.test_get_objects.<locals>.<genexpr>m  r  r   c              3       K   | ]}|u V  	d S r$   r   r  s     r   r  z+GCTests.test_get_objects.<locals>.<genexpr>p  r  r   c              3       K   | ]}|u V  	d S r$   r   r  s     r   r  z+GCTests.test_get_objects.<locals>.<genexpr>t  r  r   c              3       K   | ]}|u V  	d S r$   r   r  s     r   r  z+GCTests.test_get_objects.<locals>.<genexpr>w  r  r   c              3       K   | ]}|u V  	d S r$   r   r  s     r   r  z+GCTests.test_get_objects.<locals>.<genexpr>z  r  r   c              3       K   | ]}|u V  	d S r$   r   r  s     r   r  z+GCTests.test_get_objects.<locals>.<genexpr>~  r  r   c              3       K   | ]}|u V  	d S r$   r   r  s     r   r  z+GCTests.test_get_objects.<locals>.<genexpr>  r  r   c              3       K   | ]}|u V  	d S r$   r   r  s     r   r  z+GCTests.test_get_objects.<locals>.<genexpr>  r  r   )rG   rH   rF   rW  anyget_objectsr   rJ   s    @r   test_get_objectszGCTests.test_get_objects[  s   

	MMMM!0L0L0LMMMMM	
 	
 	
 	NNNN11M1M1MNNNNN	
 	
 	
 	MMMM!0L0L0LMMMMM	
 	
 	
 	
a    MMMM!0L0L0LMMMMM	
 	
 	
 	NNNN11M1M1MNNNNN	
 	
 	
 	MMMM!0L0L0LMMMMM	
 	
 	
 	
a    MMMM!0L0L0LMMMMM	
 	
 	
 	NNNN11M1M1MNNNNN	
 	
 	
 	MMMM!0L0L0LMMMMM	
 	
 	
 	
a    MMMM!0L0L0LMMMMM	
 	
 	
 	NNNN11M1M1MNNNNN	
 	
 	
 	MMMM!0L0L0LMMMMM	
 	
 	
 

r   c                    t          j                     |                     t          t          j                              t          t          j        d                                |                     t          t           j        d           |                     t          t           j        d           |                     t          t           j        d           |                     t          t           j        d           d S )Nr  i  i1gX9v?)rG   rH   rI   r   r  assertRaises
ValueErrorr   r:   s    r   test_get_objects_argumentsz"GCTests.test_get_objects_arguments  s    

R^--..R^t<<<==	? 	? 	? 	*bnd;;;*bne<<<)R^S999)R^U;;;;;r   c                 p    G d d          } G fdd|          t          j                     t          j                                  }|                     j        d           ~t          j                     |                     j        d           |                     t          j                  d           j                                         |                     j        d           t          j                     |                     j        d           t          j                     d S )Nc                       e Zd Zd ZdS )AGCTests.test_resurrection_only_happens_once_per_object.<locals>.Ac                     | | _         d S r$   mer:   s    r   r(   zJGCTests.test_resurrection_only_happens_once_per_object.<locals>.A.__init__      r   Nr)   r   r   r   rZ   r    #            r   rZ   c                   "    e Zd ZdZg Z fdZdS )GGCTests.test_resurrection_only_happens_once_per_object.<locals>.Lazarusr   c                 \    xj         dz  c_         j                            |            d S rC   )resurrectedresurrected_instancesrF   r'   r_  s    r   r   zOGCTests.test_resurrection_only_happens_once_per_object.<locals>.Lazarus.__del__  s4    ##q(##-44T:::::r   N)r   r   r   r  r  r   r_  s   r   r_  r    s9        K$&!; ; ; ; ; ; ;r   r_  r   rD   )	rG   rH   r   rI   r  r   r  clearr   )r'   rZ   lazr_  s      @r   .test_resurrection_only_happens_once_per_objectz6GCTests.test_resurrection_only_happens_once_per_object  sJ   	 	 	 	 	 	 	 		; 	; 	; 	; 	; 	; 	;a 	; 	; 	; 	


 gii,a000 

,a000W:;;Q??? 	%++---,a000

,a000
	r   c                 |    G d d          } G fdd          t          j                     t          j                                  } |            }t          |          }||_        ||_        ~~t          j                     |                     t          j                  d           j        	                                }| 
                    t          |d                     |                     t          |j                  |           t          j                     t          j                     d S )Nc                       e Zd Zd ZdS )6GCTests.test_resurrection_is_transitive.<locals>.Cargoc                     | | _         d S r$   r  r:   s    r   r(   z?GCTests.test_resurrection_is_transitive.<locals>.Cargo.__init__  r  r   Nr)   r   r   r   Cargor    r  r   r  c                       e Zd Zg Z fdZdS )8GCTests.test_resurrection_is_transitive.<locals>.Lazarusc                 <    j                             |            d S r$   )r  rF   r  s    r   r   z@GCTests.test_resurrection_is_transitive.<locals>.Lazarus.__del__  s     -44T:::::r   N)r   r   r   r  r   r  s   r   r_  r    s4        $&!; ; ; ; ; ; ;r   r_  rD   cargo)rG   rH   r   r   r  r  rI   r   r  r   rW  hasattrr   )r'   r  r  r  cargo_idinstancer_  s         @r   test_resurrection_is_transitivez'GCTests.test_resurrection_is_transitive  sC   	 	 	 	 	 	 	 		; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	


giie99 		 

W:;;Q???04466'22333HN++X666


	r   c                    d} G d d          } G fdd|          }g d }t          j                     t          j                      |            \  }}t          |          D ]} |             t          j                    } |            \  }	}
|                     ||           |                     |	|z
  |           |                     |
|z
  d           |	|
}} |             t          j                    } |            \  }	}
|                     |d           |                     |	|z
  d           |                     |
|z
  d           |	|
}}t          |          D ]} |              |             t          j                    } |            \  }	}
|                     ||           |                     |	|z
  |           |                     |
|z
  d           |	|
}}                                 t          j                    } |            \  }	}
|                     |d           |                     |	|z
  d           |                     |
|z
  d           t          j                     d S )	Nd   c                       e Zd Zd ZdS )LGCTests.test_resurrection_does_not_block_cleanup_of_other_objects.<locals>.Ac                     | | _         d S r$   r  r:   s    r   r(   zUGCTests.test_resurrection_does_not_block_cleanup_of_other_objects.<locals>.A.__init__  r  r   Nr)   r   r   r   rZ   r    r  r   rZ   c                       e Zd Z fdZdS )LGCTests.test_resurrection_does_not_block_cleanup_of_other_objects.<locals>.Zc                 2                         |            d S r$   r   )r'   zss    r   r   zTGCTests.test_resurrection_does_not_block_cleanup_of_other_objects.<locals>.Z.__del__  s    		$r   Nr   )r  s   r   Zr    s.                     r   r  c                  T    t          j                    d         } | d         | d         fS )Nr  r  )rG   r  )rP   s    r   getstatszSGCTests.test_resurrection_does_not_block_cleanup_of_other_objects.<locals>.getstats  s&    r"A[>1_#555r   r   rS   )rG   rH   r   r   rI   r  r   )r'   r   rZ   r  r  oldcoldncr%   rT   r   ncr  s              @r   9test_resurrection_does_not_block_cleanup_of_other_objectszAGCTests.test_resurrection_does_not_block_cleanup_of_other_objects  s   
 	 	 	 	 	 	 	 		  	  	  	  	  	  	  	  	  	  	6 	6 	6 	


 hjjeq 	 	AACCCCJLL

2AT1%%%eQ''' e	JLL

2AT1%%%eQ''' eq 	 	AACCCC	JLL

2AT1%%%eQ''' e



JLL

2AT1%%%eQ'''
	r   Nz%requires ContainerNoGC extension typec                    t           j                                        } G d d          } G d d          } |            }||_        t	           |                      |_        t          j        |j        j        |          |_	        |j	        g}|
                    |           t          j                     t          j                     ~~t          j                     |                                 t          j                     d S )Nc                       e Zd Zg dZdS )+GCTests.test_trash_weakref_clear.<locals>.A)r]   ywzNrH  r   r   r   rZ   r  >  s        (((IIIr   rZ   c                       e Zd ZdS )+GCTests.test_trash_weakref_clear.<locals>.ZNrY   r   r   r   r  r  A  r[   r   r  )unittestmockMockr]   r    r   r2   r3   valuer  rF   rG   rH   r   assert_not_calledr   )r'   rj  rZ   r  r]   wr_cycles         r   test_trash_weakref_clearz GCTests.test_trash_weakref_clear  s   @ =%%''	) 	) 	) 	) 	) 	) 	) 	)	 	 	 	 	 	 	 	 ACCAACC  {139h//D6!!!



x

 	""$$$
	r   )4r   r   r   rL   rQ   rU   r`   rd   ri   rs   ry   r   r   r   r   r   r   r   r   r   r   r   r   r   r   requires_working_threadingr  r  r#  r*  r1  r=  rY  rb  ro  rz  r   r  r  r  r  r  r  r  r  r  r  r  r  skipIfr    r
  r   r   r   rA   rA   V   s-       * * ** * ** * *- - -- - -- - -* * *0- - -   \2   \2* * *A! A! A!F * * ]*( ( (0& & && & &* ! ! ]! ) ) ])(! ! !F 102284 84 3284t6 6 606 6 666 6 6(6 6 6,; ; ;.-7 -7 -7^2 2 2$& & &0  @ .G .G  \.G`9 9 9= = =&9 9 9K K K43 3 3, , ,\< < <" " "H     DA A AF X_]d*<> >7 7> >7 7 7r   rA   c                       e Zd Zd Zd Zd Zd Zd Zd Zd Z	e
d             Z ej        ed	          d
             ZdS )GCCallbackTestsc                 R   t          j                    | _        t          j                     t          j                    | _        t          j        d           t           j                            | j	                   t           j                            | j
                   g | _        d S r  )rG   r  enabledr   r   r   r   	callbacksrF   cb1cb2othergarbager:   s    r   setUpzGCCallbackTests.setUpY  sr    |~~

\^^

Q
DH%%%
DH%%%r   c                    | ` t          j                            | j                   t          j                            | j                   t          j        | j                   | j        rt          j	                     t          j
                     t          j        D ]}t          |t                    rd |_        t          j        d d = | `t          j
                     d S r$   )visitrG   r  r   r  r  r   r   r  r   rH   r   
isinstancer6   r8   r  )r'   r   s     r   tearDownzGCCallbackTests.tearDownc  s    J
DH%%%
DH%%%
TZ   < 	IKKK

: 	# 	#C#}-- #"JqqqM

r   c                     g | _         t          j                     t          j        d d          g c}t          j        d d <   | j                            |           g | _         d S r$   )r  rG   rH   r   r  rF   )r'   r   s     r   precleanzGCCallbackTests.precleant  sX     


!#AAAAAA  )))


r   c                 Z    | j                             d|t          |          f           d S rC   )r  rF   r  )r'   phaseinfos      r   r  zGCCallbackTests.cb1~  s+    
1eT$ZZ011111r   c                    | j                             d|t          |          f           |dk    rWt          | d          rId t          j        D             }d t          j        D             t          j        d d <   |D ]}d |_        
d S d S d S )NrS   stopcleanupc                 <    g | ]}t          |t                    |S r   r  r6   rf  r   s     r   rg  z'GCCallbackTests.cb2.<locals>.<listcomp>  s'    HHH:a+G+GH!HHHr   c                 <    g | ]}t          |t                    |S r   r#  r$  s     r   rg  z'GCCallbackTests.cb2.<locals>.<listcomp>  s=     B B B1$.q-$@$@BQ B B Br   )r  rF   r  r  rG   r   r8   )r'   r  r  ucr   s        r   r  zGCCallbackTests.cb2  s    
1eT$ZZ0111F??wtY77?HHRZHHHBB B
 B B BBJqqqM ! ! 		 ???
! !r   c                 v   |                                   t          j                     d | j        D             }d |D             }d |D             }|                     |dgdz             |                     |dgdz             d | j        D             }d |D             }d |D             }|                     |d	gdz             |                     |d
gdz             | j        D ]O}|d         }|                     d|v            |                     d|v            |                     d|v            Pd S )Nc                     g | ]
}|d          S )r   r   rf  r   s     r   rg  z0GCCallbackTests.test_collect.<locals>.<listcomp>      &&&aQqT&&&r   c                     g | ]
}|d k    |S rD   r   rl  s     r   rg  z0GCCallbackTests.test_collect.<locals>.<listcomp>      %%%Aa1ffafffr   c                     g | ]
}|d k    |S )rS   r   rl  s     r   rg  z0GCCallbackTests.test_collect.<locals>.<listcomp>  r-  r   rD   rS   c                     g | ]
}|d          S r,  r   r)  s     r   rg  z0GCCallbackTests.test_collect.<locals>.<listcomp>  r*  r   c                     g | ]
}|d k    |S )startr   rl  s     r   rg  z0GCCallbackTests.test_collect.<locals>.<listcomp>  s    +++Aa7llalllr   c                     g | ]
}|d k    |S )r   r   rl  s     r   rg  z0GCCallbackTests.test_collect.<locals>.<listcomp>  s    ***Aa6kkakkkr   r1  r   r  r  r  )r  rG   rH   r  rI   rW  )r'   r   n1n2r   r  s         r   test_collectzGCCallbackTests.test_collect  sr   


 '&4:&&&%%%%%%%%%%aSU###aSU### '&4:&&&+++++*****gYq[)))fXaZ(((  	5 	5AQ4DOOLD0111OOK4/000OOOt34444		5 	5r   c                     |                                   t          j        d           | j        D ]&}|d         }|                     |d         d           'd S )NrS   r  )r  rG   rH   r  rI   )r'   r   r  s      r   test_collect_generationz'GCCallbackTests.test_collect_generation  s^    

1 	4 	4AQ4DT,/3333	4 	4r   c                 r   |                                   t                       t                       t          d           t          j                     | j        D ]O}|d         dk    r|d         }|                     |d         d           |                     |d         d           P|                     t          t          j                  d           t          j        D ]}| 	                    |t                     d| _
        g | _        g t          j        d d <   t          j                     | j        D ]O}|d         dk    r|d         }|                     |d         d	           |                     |d         d           P|                     t          t          j                  d	           d S )
Nr1   rD   r   rS   r  r  r5  Tr   )r  r6   r"   rG   rH   r  rI   r   r   r  r!  )r'   r   r  r   s       r   test_collect_garbagez$GCCallbackTests.test_collect_garbage  s   

 	7 	7Atv~~Q4DT+.222T/2A6666 	RZ!,,, 	4 	4A!!!]3333 

111

 	7 	7Atv~~Q4DT+.222T/2A6666 	RZ!,,,,,r   zbuilt with -NDEBUGc                    |                                   t          d           dd l}t          j        d          }|                    t          j        d|g|j        |j                  }|	                                \  }}|j
                                         |j                                         |                     |d           |                     |d           d}|                     |d	|z              |                     |d
           |                     |d|z              |                     |d           |                     |d           d S )N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\])r  r   r  textwrapdedentr~  r   r  r  r  r   r  r   r   )r'   r  r   r  r   r   address_regexs          r   test_refcount_errorsz$GCCallbackTests.test_refcount_errors  s    	 	h    & cndD9$.O$.O  5 5 		W	Y 	Y 	Y%	' 	' 	' *"]2	4 	4 	4#	% 	% 	%"]2	4 	4 	4&	( 	( 	(-	/ 	/ 	/ 	/ 	/r   N)r   r   r   r  r  r  r  r  r5  r7  r   r9  r  r  BUILD_WITH_NDEBUGr?  r   r   r   r  r  X  s            "  2 2 2! ! !5 5 564 4 4  -  - \ -F X_&)+ +2/ 2/+ +2/ 2/ 2/r   r  c                   &    e Zd Zd Zd Zd Zd ZdS )GCTogglingTestsc                 ,    t          j                     d S r$   )rG   r   r:   s    r   r  zGCTogglingTests.setUp	  s    
	r   c                 ,    t          j                     d S r$   )rG   r   r:   s    r   r  zGCTogglingTests.tearDown  s    

r   c                 v  
 t          d          }t          j                     t          d          }||_        |`t          d          }t          j        |          
g 
fd}t          j        ||          }d x}x}}g }d}t                      }|j        s_|dz  }|dk    r| 	                    d           | 
                    t                    d           |                    g            |j        _| 
                    t                    d           D ]}	| 
                    |	d            d S )Nr   rD   rS   c                 (                 gd d <   d S r$   r   )r/   c2wrri  s    r   rj  z2GCTogglingTests.test_bug1055820c.<locals>.callback  s    tvvhDGGGr   '  'gc didn't happen after 10000 iterations)r"   rG   rH   keep_c0_aliver&   r2   r3   r+   r.   r   rI   r   rF   )r'   c0c1c2rj  c0wrjunkr%   detectorr   rG  ri  s             @@r   test_bug1055820cz GCTogglingTests.test_bug1055820c  sa    a[[

a[[Ga[[{2	 	 	 	 	 	 {2x((R"@ ==& 	FA5yy		CDDDSYY***KKOOO & 	 	TA&&& 	& 	&A Q%%%%	& 	&r   c                 d  	
 g 
 G 	
fddt                     } |d          }t          j                     t          d          }||_        |`t          d          }t          j        |          	d x}x}}t                      }g }d}|j        s_|dz  }|dk    r| 	                    d           | 
                    t          
          d           |                    g            |j        _| 
                    t          
          d           
D ]}| 
                    |d            d S )Nc                       e Zd Z fdZdS )+GCTogglingTests.test_bug1055820d.<locals>.Dc                 (                 gd d <   d S r$   r   )r'   rG  ri  s    r   r   z3GCTogglingTests.test_bug1055820d.<locals>.D.__del__\  s    466(QQQr   Nr   )rG  ri  s   r   DrT  [  s3        # # # # # # # #r   rV  r   rD   rS   rH  rI  )r"   rG   rH   keep_d0_aliver&   r2   r3   r+   r.   r   rI   r   rF   )r'   rV  d0rL  rM  rP  rO  r%   r   rG  ri  s            @@r   test_bug1055820dz GCTogglingTests.test_bug1055820dU  sl   
 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# QqTT

a[[Ga[[{2R"< ==& 	FA5yy		CDDDSYY***KKOOO & 	 	TA&&& 	& 	&A Q%%%%	& 	&r   N)r   r   r   r  r  rQ  rY  r   r   r   rB  rB    sY            D& D& D&LA& A& A& A& A&r   rB  c                       e Zd Zd ZdS )PythonFinalizationTestsc                 N    t          j        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<  r=  r   )r'   r   s     r   test_ast_finiz%PythonFinalizationTests.test_ast_fini  s2         " 	t$$$$$r   N)r   r   r   r]  r   r   r   r[  r[    s#        % % % % %r   r[  c                      t          j                    at          j                     t          j                    at          j        t
          t           j         z             t          j                     d S r$   )	rG   r  r  r   r   r   r   
DEBUG_LEAKrH   r   r   r   setUpModuler`    sK    lnnGJLLLLNNEL"-'(((JLLLLLr   c                      t          j        t                     t          rt	          d           t          j                     t          st          j                     d S d S )Nzrestoring automatic collection)rG   r   r   r   printr   r  r   r   r   r   tearDownModulerc    sU    L 0.///IKKK 

 r   __main__)-r  unittest.mocktest.supportr   r   r   r   test.support.import_helperr   test.support.os_helperr   r	   r
   test.support.script_helperr   r   r   rG   r   	sysconfigr<  r   r   r2   	_testcapir   ImportErrorr    r   r"   r+   r6   get_config_varsgetr@  r  TestCaserA   r  rB  r[  r`  rc  r   mainr   r   r   <module>rq     sz       = = = = = = = = = = = = 4 4 4 4 4 4 ; ; ; ; ; ; ; ; ; ; D D D D D D D D ) ) ) ) ) ) 				 



           %%%%%%%       '''''''   MMM    v   
: : : : :& : : :     F    9"";33 ?#'@y'@'B'B;'OO
 %WS*<===
    h   D m/ m/ m/ m/ m/h' m/ m/ m/`N& N& N& N& N&h' N& N& N&b% % % % %h/ % % %6  	 	 	 zHMOOOOO s$   A A"!A"&A- -A76A7