(root)/
Python-3.11.7/
Lib/
test/
crashers/
mutation_inside_cyclegc.py
       1  
       2  # The cycle GC collector can be executed when any GC-tracked object is
       3  # allocated, e.g. during a call to PyList_New(), PyDict_New(), ...
       4  # Moreover, it can invoke arbitrary Python code via a weakref callback.
       5  # This means that there are many places in the source where an arbitrary
       6  # mutation could unexpectedly occur.
       7  
       8  # The example below shows list_slice() not expecting the call to
       9  # PyList_New to mutate the input list.  (Of course there are many
      10  # more examples like this one.)
      11  
      12  
      13  import weakref
      14  
      15  class ESC[4;38;5;81mA(ESC[4;38;5;149mobject):
      16      pass
      17  
      18  def callback(x):
      19      del lst[:]
      20  
      21  
      22  keepalive = []
      23  
      24  for i in range(100):
      25      lst = [str(i)]
      26      a = A()
      27      a.cycle = a
      28      keepalive.append(weakref.ref(a, callback))
      29      del a
      30      while lst:
      31          keepalive.append(lst[:])