
    dafؾ                        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 	 d d	lmZ  G d
 de      Z G d de      Ze G d de             Z ej@                         jC                  dd      rd ej@                         d   v Z"n
 e#ed       Z" G d de jH                        Z% G d de jH                        Z& G d de jH                        Z' G d de jH                        Z(d Z)d Z*e+dk(  r e jX                          yy# e$ r d ZY w xY w# e$ r dZY w xY w)    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y)with_tp_del.<locals>.Cc                     t        d      )Nzrequires _testcapi.with_tp_del)	TypeError)clsargskwargss      '/root/Python-3.12.4/Lib/test/test_gc.py__new__zwith_tp_del.<locals>.C.__new__   s     @AA    N)__name__
__module____qualname__r    r   r   Cr      s    Br   r   )object)r   r   s     r   r   r      s    	B 	B r   )ContainerNoGCc                       e Zd Zd Zy)C1055820c                      || _         | | _        y 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y)GC_Detectorc                 f     d _          fd}t        j                  t        d      |       _        y )NFc                     d_         y )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   s(     	$
 ++hsm[9r   Nr)   r   r   r   r+   r+   -   s    :r   r+   c                       e Zd ZdZddZd Zy)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                 :    |t        |       | _        y || _        y )N)partner)r6   r8   )r'   r8   s     r   r(   zUncollectable.__init__C   s    ?(6DL"DLr   c                      y 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   ;   s    )#
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j2                         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- e.j^                  e0d'u d(      d)        Z1y')*GCTestsc                     g }|j                  |       t        j                          ~| j                  t        j                         d       y N   appendgccollectassertEqualr'   ls     r   	test_listzGCTests.test_listW   s4    	


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


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


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


BJJL!,r   c                      G d dt               }t        j                          ~| j                  t        j                         d       y )Nc                       e Zd Zy)%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   s0    	 	


BJJL!,r   c                      G d d      } |       }||_         t        j                          ~| j                  t        j                         d       y )Nc                       e Zd Zy) 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~   s<    	 	C


BJJL!,r   c                 j    G d dt               } |       }||_        t        j                          ~| j	                  t        j                         d        G d dt
              } G d d||      } |       }||_        t        j                          ~| j	                  t        j                         d       ~~| j	                  t        j                         d        |       |_        ~| j	                  t        j                         d       | j                  t        j                         d       y )Nc                       e Zd Zy)#GCTests.test_newinstance.<locals>.ANrY   r   r   r   rZ   rl      r[   r   rZ   r   c                       e Zd Zy)#GCTests.test_newinstance.<locals>.BNrY   r   r   r   Brn      r[   r   ro   c                       e Zd Zy)#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   s    	 	C


BJJL!,	 		1 	C


BJJL!,qBJJL!,cBJJL!,q)r   c                      G d d      } |       }t        j                          ~| j                  t        j                         d       y )Nc                       e Zd Zd Zy)GCTests.test_method.<locals>.Ac                 &    | j                   | _        y r$   )r(   initr:   s    r   r(   z'GCTests.test_method.<locals>.A.__init__   s     MM	r   Nr)   r   r   r   rZ   rv      s    *r   rZ   r   )rG   rH   r^   rh   s      r   test_methodzGCTests.test_method   s7    	* 	* C


BJJL!,r   c                    t          G d d             } G d d      } |       }||_        t        |      } |       }||_        t	        j
                          ~~| j                  t	        j
                         d       t        j                  D ]  }t        |      |k(  s|` n | j                  d       t        j                  j                         y )Nc                       e Zd Zd Zy)(GCTests.test_legacy_finalizer.<locals>.Ac                      y 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y)(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     
	' 	' 
	'	 	C!uC


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


#r   c                    t          G d dt                     } G d dt              } |       }||_        t        |      } |       }||_        t        j                          ~~| j                  t        j                         d       t
        j                  D ]  }t        |      |k(  s|` n | j                  d       t
        j                  j                         y )Nc                       e Zd Zd Zy)1GCTests.test_legacy_finalizer_newclass.<locals>.Ac                      y 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y)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     
	' 	' 
	'	 	C!uC


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


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


q)r   c                     d}t        d|      \  }}}| j                  |d       | j                  |d       | j                  |       y )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   sN    :x .dD9FFQ!JK r   c                     d }t        j                           |        | j                  t        j                         d       y )Nc                  ,    t        j                         } y r$   )sys	_getframe)frames    r   fzGCTests.test_frame.<locals>.f+  s    MMOEr   rD   rN   )r'   r   s     r   
test_framezGCTests.test_frame)  s+    	$


	q)r   c                 4   t        j                          | j                  t         j                  g        g }|j	                  |       t        |      }t        j                         }t        j                  |t         j                  z         ~t        j                          t        j                  |       | j                  t        t         j                        d       t         j                  j                         }| j                  t        |      |       y 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(	!u
UR---.



URZZ!,jjnnC$'r   c                     t        j                         }t        j                          t        j                  d        G d d      } |       }~t        j                          t        j                  |  y )NrD   c                       e Zd Zd Zy)GCTests.test_del.<locals>.Ac                     t        |        y 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  sT    %%'

		
	 	 C



*%r   c                     t        j                         }t        j                          t        j                  d        G d dt              } |       }~t        j
                          t        j                  |  y )NrD   c                       e Zd Zd Zy)$GCTests.test_del_newclass.<locals>.Ac                     t        |        y 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  sV    %%'

		
	 	 C


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


,,.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                         \  }}	}
| j                  ||fd       | j                  ||fd       | j                  |	|
fd       y )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                 6    G fdd      t        j                          d}t        d      D ]T  }g }t        |      D ]  }|        g} g }t        |      D ]  }|        g} i }t        |      D ]  }|        d} V t        j                          y )Nc                       e Zd ZdZ fdZy)#GCTests.test_trashcan.<locals>.Ouchr   c                 |    j                   dz   _         j                   dz  dk(  rt        j                          y y )NrD      r   )nrG   rH   )r'   Ouchs    r   r   z+GCTests.test_trashcan.<locals>.Ouch.__del__  s0    !66B;!#JJL $r   N)r   r   r   r   r   )r   s   r   r   r     s    A!r   r      rS   )rD   rS   )rG   r   ranger   )r'   NcountrT   r%   uvr   s          @r   test_trashcanzGCTests.test_trashcan  s    	! 	!( 			1X 		&EA1X  K A1X  K A1X &df%&		& 	

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                  |	      }|j                  |       + t        j                  |	fd
      5  t        j                  d       d d d        t        j                  |       t        j                          | j                  t        j                         t        j"                               y # 1 sw Y   kxY w# t        j                  |       w xY w)N<   rS   c               3   t   K   	 d t        j                  d       y# t        j                  d       w xY w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   8 858c                   ,    e Zd Zg Zg Z fdZ fdZy)(GCTests.test_trashcan_threads.<locals>.Cc                 F    || d d  j                   j                  d        y r$   )initsrF   )r'   alistr   s     r   r(   z1GCTests.test_trashcan_threads.<locals>.C.__init__  s    Qt$r   c                 `    j                   j                  d                }t        |       y r$   )delsrF   next)r'   r   r   r   s     r   r   z0GCTests.test_trashcan_threads.<locals>.C.__del__  s#    d#  MQr   N)r   r   r   r   r   r(   r   )r   r   s   r   r   r     s    ED%r   r   c                  L     g       } t              D ]  } | g      g}  ~ y)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  s1     "A7^ sVHr   c                        s          s
yy)z!Exercise make_nested() in a loop.Nr   )exitr   s   r   
run_threadz1GCTests.test_trashcan_threads.<locals>.run_thread  s     r   gh㈵>)targetc                  &     j                  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24d#		6DG9% "$$J7q!" "//9OP  

3  !!"45


QWWs166{3    !!"45s%   AD5 )D)?D5 )D2.D5 5Ec                 H    G d d      } |       } |       }||_         ||_         t        j                          t        t        j                        }~~| j                  t        j                         d       | j                  t        t        j                        |       y )Nc                       e Zd Zd Zy)GCTests.test_boom.<locals>.Boomc                     | ` t        r$   )attrAttributeErrorr'   someattributes     r   __getattr__z+GCTests.test_boom.<locals>.Boom.__getattr__  s    I$$r   N)r   r   r   r  r   r   r   Boomr    s    %r   r  rS   r	  rG   rH   r   r   rI   )r'   r  r]   r   
garbagelens        r   	test_boomzGCTests.test_boom  su    	% 	%
 FF


_
q 	q)RZZ*5r   c                 H    G d d      } |       } |       }||_         ||_         t        j                          t        t        j                        }~~| j                  t        j                         d       | j                  t        t        j                        |       y )Nc                       e Zd Zd Zd Zy)!GCTests.test_boom2.<locals>.Boom2c                     d| _         y Nr   r   r:   s    r   r(   z*GCTests.test_boom2.<locals>.Boom2.__init__  	    r   c                 Z    | xj                   dz  c_         | j                   dkD  r| `t        rC   )r   r	  r
  r  s     r   r  z-GCTests.test_boom2.<locals>.Boom2.__getattr__  s%    !66A:	$$r   N)r   r   r   r(   r  r   r   r   Boom2r    s    %r   r  rS   r  )r'   r  r]   r   r  s        r   
test_boom2zGCTests.test_boom2  su    	% 	% GG


_
q 	q)RZZ*5r   c           	      t   g d}t        j                  |      }|j                          | j                  ||       t	        |      }t        j                  |      }|j                          | j                  ||       ddd}g d}t        j                  |      }|j                          | j                  ||       t        j                  ddgddid	      }|j                          | j                  |d
d
gt        t        d            z          | j                  t        j                  ddd      g        y )N)rD      r   r     )rD   r   )rD   r  r   r  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_referents!  s    u%
e$uv&
e$!u%
h'1v1vy9
q!ftE!H~56))!S"5r:r   c                 :   | j                  t        j                  d              | j                  t        j                  d             | j                  t        j                  d             | j                  t        j                  d             | j                  t        j                  d             | j                  t        j                  d             | j                  t        j                  d             | j                  t        j                  d             | j                  t        j                  t        d                   | j                  t        j                  t                     | j                  t        j                  t
                     | j                  t        j                  t                     | j                  t        j                  t                             G d d	      } G d
 dt
              } G d d      } G d dt              } G d dt
              }| j                  t        j                  t                     | j                  t        j                  |             | j                  t        j                   |                    | j                  t        j                   |                    | j                  t        j                  g              | j                  t        j                  t                            | j                  t        j                   |                    | j                  t        j                   |                    | j                  t        j                   |                    y )NrD   r   y      ?      @TF   ar]   c                       e Zd Zy)*GCTests.test_is_tracked.<locals>.UserClassNrY   r   r   r   	UserClassr+  K  r[   r   r,  c                       e Zd Zy)(GCTests.test_is_tracked.<locals>.UserIntNrY   r   r   r   UserIntr.  N  r[   r   r/  c                       e Zd ZdZy)/GCTests.test_is_tracked.<locals>.UserClassSlotsr   Nr   r   r   	__slots__r   r   r   UserClassSlotsr1  R      Ir   r4  c                       e Zd ZdZy)/GCTests.test_is_tracked.<locals>.UserFloatSlotsr   Nr2  r   r   r   UserFloatSlotsr7  V  r5  r   r8  c                       e Zd ZdZy)-GCTests.test_is_tracked.<locals>.UserIntSlotsr   Nr2  r   r   r   UserIntSlotsr:  Z  r5  r   r;  )
r   rG   
is_tracked	bytearraytypeintr   float
assertTrueset)r'   r,  r/  r4  r8  r;  s         r   test_is_trackedzGCTests.test_is_tracked8  s:   
 	t,-q)*s+,z23t,-u-.t,-s+,y78t,-s+,v./vx01	 		c 		 		U 		3 	 	b)*i01ik23gi01b)*ce,-n&678n&678ln56r   c                 R   | j                  t        j                  d             g  G fdd      } |       }| j                  t        j                  |             ~t        j                          j	                         }| j                  t        j                  |             y )Nr  c                       e Zd Z fdZy)*GCTests.test_is_finalized.<locals>.Lazarusc                 (    j                  |        y r$   r   )r'   storages    r   r   z2GCTests.test_is_finalized.<locals>.Lazarus.__del__m  s    t$r   Nr   )rH  s   r   LazarusrF  l  s    %r   rI  )r   rG   is_finalizedrH   r   rA  )r'   rI  lazarusrH  s      @r   test_is_finalizedzGCTests.test_is_finalizedg  su    +,	% 	% )12


++-01r   c                    g fd}t        d      D cg c]  }t        |       }}|D cg c]  }t        j                  ||       c}d }t	        j
                          | j                  t              d       d }t	        j
                          | j                  t              d       D ]  }| j                  |d         y c c}w c c}w )Nc                 @    D cg c]	  } |        c}d d  y c c}w r$   r   )r/   r4   WRsouchs     r   callbackz*GCTests.test_bug1055820b.<locals>.callback}  s    &)*rt*DG*s   rS   r   )r   r"   r2   r3   rG   rH   rI   r   )r'   rQ  r%   Csr   r   rO  rP  s         @@r   test_bug1055820bzGCTests.test_bug1055820by  s     	+ $)8,ahqk,,134Aw{{1h'4


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


TA& 	&A Q%	& -4s
   CCc                     t        j                           G d d       G d d      fd} |        t        j                          y )Nc                       e Zd Zy) GCTests.test_bug21435.<locals>.ANrY   r   r   r   rZ   rV    r[   r   rZ   c                       e Zd Zd Zd Zy) GCTests.test_bug21435.<locals>.Bc                     || _         y r$   r  )r'   r   s     r   r(   z)GCTests.test_bug21435.<locals>.B.__init__  r  r   c                     d | _         y 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   rX    s    !r   ro   c                  J            }                }|| _         | |_         y r$   r[  )r]   r   rZ   ro   s     r   do_workz&GCTests.test_bug21435.<locals>.do_work  s#    A!#AAFAFr   )rG   rH   )r'   r]  rZ   ro   s     @@r   test_bug21435zGCTests.test_bug21435  s7     	

	 		! 	!	 		


r   c                 &    dd l d} fd} ||dz        } j                  d|        j                  d|        ||dz        } j                  d|        j                  d	|v xs d
|v |        ||dz        } j                  d|       y )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                 f   j                  t        j                  dd| gj                  j                        }|j	                         \  }}|j
                  j                          |j                  j                          j                  |j                  d       j                  |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HHNNHHNN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)ri  assertInassertNotInrA  )r'   r   rj  r   ri  s   `   @r   test_garbage_at_shutdownz GCTests.test_garbage_at_shutdown  s     	$		 TCZ( '(.	00T$<<= "#)	++v5 7+v5	@ T$667=vFr   c                 h    d}t        d|      \  }}}| j                  |j                         d       y )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  s4     (d3C&78r   c                     t               5 }d}d|d}t        |d|       t        d|      \  }}}| j                  |j	                         d       d d d        y # 1 sw Y   y xY w)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   rp  )r   r   r   rI   rq  )r'   
script_dirmoduler   r   rr  rs  s          r   #test_gc_ordinary_module_at_shutdownz+GCTests.test_gc_ordinary_module_at_shutdown  sh    Z 	=:F "	$D
 
Hf5+D$7LBSSYY[*;<	= 	= 	=s   AAA#c                    d}| j                  t        t               t        t        dd      5 }|j	                  |       d d d        t        t              \  }}}| j                  |j                         d       y # 1 sw Y   =xY w)Nzif 1:
            class ClassWithDel:
                def __del__(self):
                    print('__del__ called')
            a = ClassWithDel()
            a.link = a
            raise SystemExit(0)wzutf-8)encodingrp  )
addCleanupr
   r	   openwriter   rI   rq  )r'   r   scriptr   rr  rs  s         r   test_global_del_SystemExitz"GCTests.test_global_del_SystemExit  so    # 	'&#0 	FLL	'/C&78	 	s   A==Bc                 (   t        j                         }| j                  t        |      d       |D ]t  }| j	                  |t
               | j                  t        |      h d       | j                  |d   d       | j                  |d   d       | j                  |d   d       v t        j                         r3| j                  t         j                         t        j                          t        j                         }t        j                  d       t        j                         }| j                  |d   d   |d   d   dz          | j                  |d   d   |d   d          | j                  |d   d   |d   d          t        j                  d       t        j                         }| j                  |d   d   |d   d   dz          | j                  |d   d   |d   d          | j                  |d   d   |d   d   dz          y )	Nr  >   	collectedcollectionsuncollectabler  r   r  r  rD   rS   )rG   	get_statsrI   r   assertIsInstancedictrB  assertGreaterEqual	isenabledr}  r   r   rH   )r'   statsstoldnews        r   test_get_statszGCTests.test_get_stats  s   UQ' 	<B!!"d+SWJL##B{OQ7##B}$5q9##B$7;	< <<>OOBII&JJLlln


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


1llnQ.A}0E0IJQ.A}0EFQ.A}0E0IJr   c                     t        j                          | j                  t        j                         d       t        j                          | j                  t        j                         d       y r  )rG   freezer   get_freeze_countunfreezerI   r:   s    r   test_freezezGCTests.test_freeze+  sF    
		2..0!4
,,.2r   c                 *   t        j                          g j                         | j                  t	        fdt        j
                  d      D                     | j                  t	        fdt        j
                  d      D                     | j                  t	        fdt        j
                  d      D                     t        j                  d       | j                  t	        fdt        j
                  d      D                     | j                  t	        fd	t        j
                  d      D                     | j                  t	        fd
t        j
                  d      D                     t        j                  d       | j                  t	        fdt        j
                  d      D                     | j                  t	        fdt        j
                  d      D                     | j                  t	        fdt        j
                  d      D                     t        j                  d       | j                  t	        fdt        j
                  d      D                     | j                  t	        fdt        j
                  d      D                     | j                  t	        fdt        j
                  d      D                     t        j                          y )Nc              3   &   K   | ]  }|u  
 y wr$   r   .0elementrK   s     r   	<genexpr>z+GCTests.test_get_objects.<locals>.<genexpr>6       MWALM   r   
generationc              3   &   K   | ]  }|u  
 y wr$   r   r  s     r   r  z+GCTests.test_get_objects.<locals>.<genexpr>9       NWALNr  rD   c              3   &   K   | ]  }|u  
 y wr$   r   r  s     r   r  z+GCTests.test_get_objects.<locals>.<genexpr><  r  r  rS   c              3   &   K   | ]  }|u  
 y wr$   r   r  s     r   r  z+GCTests.test_get_objects.<locals>.<genexpr>@  r  r  c              3   &   K   | ]  }|u  
 y wr$   r   r  s     r   r  z+GCTests.test_get_objects.<locals>.<genexpr>C  r  r  c              3   &   K   | ]  }|u  
 y wr$   r   r  s     r   r  z+GCTests.test_get_objects.<locals>.<genexpr>F  r  r  c              3   &   K   | ]  }|u  
 y wr$   r   r  s     r   r  z+GCTests.test_get_objects.<locals>.<genexpr>J  r  r  c              3   &   K   | ]  }|u  
 y wr$   r   r  s     r   r  z+GCTests.test_get_objects.<locals>.<genexpr>M  r  r  c              3   &   K   | ]  }|u  
 y wr$   r   r  s     r   r  z+GCTests.test_get_objects.<locals>.<genexpr>P  r  r  c              3   &   K   | ]  }|u  
 y wr$   r   r  s     r   r  z+GCTests.test_get_objects.<locals>.<genexpr>T  r  r  c              3   &   K   | ]  }|u  
 y wr$   r   r  s     r   r  z+GCTests.test_get_objects.<locals>.<genexpr>W  r  r  c              3   &   K   | ]  }|u  
 y wr$   r   r  s     r   r  z+GCTests.test_get_objects.<locals>.<genexpr>Z  r  r  )rG   rH   rF   rA  anyget_objectsr   rJ   s    @r   test_get_objectszGCTests.test_get_objects1  s   


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

a M!0LMM	
 	N11MNN	
 	M!0LMM	
 	

a M!0LMM	
 	N11MNN	
 	M!0LMM	
 	

a M!0LMM	
 	N11MNN	
 	M!0LMM	
 


r   c                    t        j                          | j                  t        t        j                               t        t        j                  d                    | j                  t        t         j                  d       | j                  t        t         j                  d       | j                  t        t         j                  d       | j                  t        t         j                  d       y )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<=	? 	*bnnd;*bnne<)R^^S9)R^^U;r   c                 j    G d d      } G fdd|      t        j                          t        j                                  }| j                  j                  d       ~t        j                          | j                  j                  d       | j                  t        j                        d       j                  j                          | j                  j                  d       t        j                          | j                  j                  d       t        j                          y )Nc                       e Zd Zd Zy)AGCTests.test_resurrection_only_happens_once_per_object.<locals>.Ac                     | | _         y r$   mer:   s    r   r(   zJGCTests.test_resurrection_only_happens_once_per_object.<locals>.A.__init__k  	    r   Nr)   r   r   r   rZ   r  j      r   rZ   c                        e Zd ZdZg Z fdZy)GGCTests.test_resurrection_only_happens_once_per_object.<locals>.Lazarusr   c                 f    xj                   dz  c_         j                  j                  |        y rC   )resurrectedresurrected_instancesrF   r'   rI  s    r   r   zOGCTests.test_resurrection_only_happens_once_per_object.<locals>.Lazarus.__del__r  s(    ##q(#--44T:r   N)r   r   r   r  r  r   rI  s   r   rI  r  n  s    K$&!;r   rI  r   rD   )	rG   rH   r   rI   r  r   r  clearr   )r'   rZ   lazrI  s      @r   .test_resurrection_only_happens_once_per_objectz6GCTests.test_resurrection_only_happens_once_per_objecti  s    	 		;a 	; 	




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


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


,,a0
		r   c                 J    G d d      } G fdd      t        j                          t        j                                  } |       }t        |      }||_        ||_        ~~t        j                          | j                  t        j                        d       j                  j                         }| j                  t        |d             | j                  t        |j                        |       t        j                          t        j                          y )Nc                       e Zd Zd Zy)6GCTests.test_resurrection_is_transitive.<locals>.Cargoc                     | | _         y 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y)8GCTests.test_resurrection_is_transitive.<locals>.Lazarusc                 <    j                   j                  |        y 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   rI  r    s    $&!;r   rI  rD   cargo)rG   rH   r   r   r  r  rI   r   r  r   rA  hasattrr   )r'   r  r  r  cargo_idinstancerI  s         @r   test_resurrection_is_transitivez'GCTests.test_resurrection_is_transitive  s    	 		; 	; 	




ie9 		 


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



		r   c                 N   d} G d d      } G fdd|      }g d }t        j                          t        j                           |       \  }}t        |      D ]	  } |         t        j                         } |       \  }	}
| j	                  ||       | j	                  |	|z
  |       | j	                  |
|z
  d       |	|
}} |        t        j                         } |       \  }	}
| j	                  |d       | j	                  |	|z
  d       | j	                  |
|z
  d       |	|
}}t        |      D ]	  } |          |        t        j                         } |       \  }	}
| j	                  ||       | j	                  |	|z
  |       | j	                  |
|z
  d       |	|
}}j                          t        j                         } |       \  }	}
| j	                  |d       | j	                  |	|z
  d       | j	                  |
|z
  d       t        j                          y )	Nd   c                       e Zd Zd Zy)LGCTests.test_resurrection_does_not_block_cleanup_of_other_objects.<locals>.Ac                     | | _         y 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y)LGCTests.test_resurrection_does_not_block_cleanup_of_other_objects.<locals>.Zc                 (    j                  |        y 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                  D    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 	




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





x


 	""$
		r   )2r   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'  rC  rL  rS  r^  r   rn  rt  ry  r  r  r  r  r  r  r  r  r  skipIfr    r  r   r   r   rA   rA   V   sx   ***---*0-  2  2*A!F * *(0&&* ! ! ) )(!F 100284 384t6066;.-7^2$&0@ .G  .G`9=&9K43,\<"H DAF X__]d*<>7>7r   rA   c                   x    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y)GCCallbackTestsc                 l   t        j                         | _        t        j                          t        j                         | _        t        j                  d       t         j                  j                  | j                         t         j                  j                  | j                         g | _        y r  )rG   r  enabledr   r   r   r   	callbacksrF   cb1cb2othergarbager:   s    r   setUpzGCCallbackTests.setUp/  sd    ||~


\\^

Q
DHH%
DHH%r   c                    | ` t        j                  j                  | j                         t        j                  j                  | j
                         t        j                  | j                         | j                  rt        j                          t        j                          t        j                  D ]  }t        |t              sd |_         t        j                  d d = | `t        j                          y r$   )visitrG   r  r   r  r  r   r   r  r   rH   r   
isinstancer6   r8   r  )r'   r   s     r   tearDownzGCCallbackTests.tearDown9  s    J
DHH%
DHH%
TZZ <<IIK


:: 	#C#}-"	# JJqM


r   c                     g | _         t        j                          t        j                  d d  g c}t        j                  d d  | j                  j                  |       g | _         y r$   )r  rG   rH   r   r  rF   )r'   r   s     r   precleanzGCCallbackTests.precleanJ  sK     



!#AA  )
r   c                 R    | j                   j                  d|t        |      f       y rC   )r  rF   r  )r'   phaseinfos      r   r  zGCCallbackTests.cb1T  s    

1eT$Z01r   c                    | j                   j                  d|t        |      f       |dk(  rt        | d      r|t        j
                  D cg c]  }t        |t              s| }}t        j
                  D cg c]  }t        |t              s| c}t        j
                  d d  |D ]	  }d |_         y y y c c}w c c}w )NrS   stopcleanup)	r  rF   r  r  rG   r   r  r6   r8   )r'   r  r  r   ucs        r   r  zGCCallbackTests.cb2W  s    

1eT$Z01F?wtY7ZZH:a+G!HBH(*

 B1$.q-$@  BBJJqM ! 	!  8?HBs   B7!B79B<c                    | j                          t        j                          | j                  D cg c]  }|d   	 }}|D cg c]
  }|dk(  s	| }}|D cg c]
  }|dk(  s	| }}| j	                  |dgdz         | j	                  |dgdz         | j                  D cg c]  }|d   	 }}|D cg c]
  }|dk(  s	| }}|D cg c]
  }|dk(  s	| }}| j	                  |dgdz         | j	                  |dgdz         | j                  D ]@  }|d   }| j                  d|v        | j                  d|v        | j                  d|v        B y c c}w c c}w c c}w c c}w c c}w c c}w )	Nr   rD   rS   startr  r  r  r  )r  rG   rH   r  rI   rA  )r'   r   r   r%   n1n2r  s          r   test_collectzGCCallbackTests.test_collecta  sq   


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


1 	4AQ4DT,/3	4r   c                    | j                          t                t                t        d       t        j                          | j
                  D ]:  }|d   dk7  r|d   }| j                  |d   d       | j                  |d   d       < | j                  t        t        j                        d       t        j                  D ]  }| j                  |t                d| _
        g | _        g t        j                  d d  t        j                          | j
                  D ]:  }|d   dk7  r|d   }| j                  |d   d	       | j                  |d   d       < | j                  t        t        j                        d	       y )
Nr1   rD   r  rS   r  r  r  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  sJ   


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

1


 	7Atv~Q4DT+.2T/2A6	7 	RZZ!,r   zbuilt with -NDEBUGc                 x   | j                          t        d       dd l}t        j                  d      }|j                  t        j                  d|g|j                  |j                        }|j                         \  }}|j                  j                          |j                  j                          | j                  |d       | j                  |d       d}| j                  |d	|z          | j                  |d
       | j                  |d|z          | j                  |d       | j                  |d       y )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   ra  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   ri  textwrapdedentrb  r   rc  rd  re  r   rf  r   r   )r'   ri  r   rh  r   r   address_regexs          r   test_refcount_errorsz$GCCallbackTests.test_refcount_errors  s#    	 	h   & cnndD9$.OO$.OO  5 		W	Y%	' *"]2	4#	%"]2	4&	(-	/r   N)r   r   r   r  r  r  r  r  r  r  r   r  r  r  BUILD_WITH_NDEBUGr  r   r   r   r  r  .  s_    "2!564  -  -F X__&)+2/+2/r   r  c                   *    e Zd Zd Zd Zd Zd Zd Zy)GCTogglingTestsc                 ,    t        j                          y r$   )rG   r   r:   s    r   r  zGCTogglingTests.setUp  s    
		r   c                 ,    t        j                          y r$   )rG   r   r:   s    r   r  zGCTogglingTests.tearDown  s    


r   c                 :  
 t        d      }t        j                          t        d      }||_        |`t        d      }t        j                  |      
g 
fd}t        j                  ||      }d x}x}}g }d}t               }|j                  sT|dz  }|dkD  r| j                  d       | j                  t              d       |j                  g        |j                  sT| j                  t              d       D ]  }	| j                  |	d         y )Nr   rD   rS   c                             gd d  y r$   r   )r/   c2wrrP  s    r   rQ  z2GCTogglingTests.test_bug1055820c.<locals>.callback  s    vhDGr   '  'gc didn't happen after 10000 iterations)r"   rG   rH   keep_c0_aliver&   r2   r3   r+   r.   r   rI   r   rF   )r'   c0c1c2rQ  c0wrjunkr%   detectorr   r  rP  s             @@r   test_bug1055820cz GCTogglingTests.test_bug1055820c  s	    a[


a[Ga[{{2	 {{2x(R"@ =&&FA5y		CDSY*KKO && 	TA& 	&A Q%	&r   c                    	
 g 
 G 	
fddt               } |d      }t        j                          t        d      }||_        |`t        d      }t        j                  |      	d x}x}}t               }g }d}|j                  sT|dz  }|dkD  r| j                  d       | j                  t        
      d       |j                  g        |j                  sT| j                  t        
      d       
D ]  }| j                  |d         y )Nc                       e Zd Z fdZy)+GCTogglingTests.test_bug1055820d.<locals>.Dc                             gd d  y r$   r   )r'   r  rP  s    r   r   z3GCTogglingTests.test_bug1055820d.<locals>.D.__del__2  s    6(Qr   Nr   )r  rP  s   r   Dr,  1  s    #r   r.  r   rD   rS   r   r!  )r"   rG   rH   keep_d0_aliver&   r2   r3   r+   r.   r   rI   r   rF   )r'   r.  d0r$  r%  r(  r'  r%   r   r  rP  s            @@r   test_bug1055820dz GCTogglingTests.test_bug1055820d+  s    
 	# 	# qT


a[Ga[{{2R"< =&&FA5y		CDSY*KKO && 	TA& 	&A Q%	&r   c                    g }d}t               }|j                  s9|dz  }|dkD  r| j                  d       |j                  g        |j                  s9	 t	        j
                          g }d}t               }|j                  s)|dz  }|dkD  rn|j                  g        |j                  s)| j                  |d       t	        j                          y # t	        j                          w xY w)Nr   rD   r   r!  i'  )r+   r.   r   rF   rG   r   rI   r   )r'   r'  r%   r(  s       r   $test_indirect_calls_with_gc_disabledz4GCTogglingTests.test_indirect_calls_with_gc_disabledn  s    =&&FA5y		CDKKO	 &&	JJLDA"}H**Qu9B	 ** Q&IIKBIIKs   AC ,C C)N)r   r   r   r  r  r)  r1  r3  r   r   r   r  r    s    D&LA&Fr   r  c                       e Zd Zd Zy)PythonFinalizationTestsc                 F    t        j                  d      }t        d|       y )NaM  
            import ast
            import codecs
            from test import support

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

            # Store the tree somewhere to survive until the last GC collection
            support.late_deletion(tree)
        r   )r  r  r   )r'   r   s     r   test_ast_finiz%PythonFinalizationTests.test_ast_fini  s#      
  
 	t$r   N)r   r   r   r7  r   r   r   r5  r5    s    %r   r5  c                  &   t        j                         at        j                          t        j                         rJ t        j                         at        j                  t
        t         j                   z         t        j                          y r$   )	rG   r  r  r   r   r   r   
DEBUG_LEAKrH   r   r   r   setUpModuler:    sP    llnGJJL||~LLNELL"--'(JJLr   c                      t        j                  t               t        rt	        d       t        j
                          t        j                         sJ t        st        j                          y y )Nzrestoring automatic collection)	rG   r   r   r   printr   r  r  r   r   r   r   tearDownModuler=    sB    LL./IIK<<>>


 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  r  r5  r:  r=  r   mainr   r   r   <module>rK     si    = = 4 ; ; D ) 	 
     %'v 
:& : F   9"";3#'@y'@'@'B;'OO
 %S*<==
Uh Upm/h'' m/`gh'' gT%h// %*	 zHMMO ,    Ms$   D7 E 7EEEE