32 lines
753 B
Python
32 lines
753 B
Python
|
|
||
|
# The cycle GC collector can be executed when any GC-tracked object is
|
||
|
# allocated, e.g. during a call to PyList_New(), PyDict_New(), ...
|
||
|
# Moreover, it can invoke arbitrary Python code via a weakref callback.
|
||
|
# This means that there are many places in the source where an arbitrary
|
||
|
# mutation could unexpectedly occur.
|
||
|
|
||
|
# The example below shows list_slice() not expecting the call to
|
||
|
# PyList_New to mutate the input list. (Of course there are many
|
||
|
# more examples like this one.)
|
||
|
|
||
|
|
||
|
import weakref
|
||
|
|
||
|
class A(object):
|
||
|
pass
|
||
|
|
||
|
def callback(x):
|
||
|
del lst[:]
|
||
|
|
||
|
|
||
|
keepalive = []
|
||
|
|
||
|
for i in range(100):
|
||
|
lst = [str(i)]
|
||
|
a = A()
|
||
|
a.cycle = a
|
||
|
keepalive.append(weakref.ref(a, callback))
|
||
|
del a
|
||
|
while lst:
|
||
|
keepalive.append(lst[:])
|