From: Armin Rigo Date: Fri, 25 Apr 2008 09:35:18 +0000 (+0000) Subject: A new crasher. X-Git-Tag: v2.6a3~103 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5364e2e46f7566e1917d013f83c431a72de76009;p=python A new crasher. --- diff --git a/Lib/test/crashers/mutation_inside_cyclegc.py b/Lib/test/crashers/mutation_inside_cyclegc.py new file mode 100644 index 0000000000..2b67398bcc --- /dev/null +++ b/Lib/test/crashers/mutation_inside_cyclegc.py @@ -0,0 +1,31 @@ + +# 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[:])