diff options
author | Armin Rigo <arigo@tunes.org> | 2008-04-25 09:35:18 (GMT) |
---|---|---|
committer | Armin Rigo <arigo@tunes.org> | 2008-04-25 09:35:18 (GMT) |
commit | 5364e2e46f7566e1917d013f83c431a72de76009 (patch) | |
tree | f5566bbf2facc24fdef8747cde350ec867940e43 /Lib/test/crashers | |
parent | 2b0bea5d27c53f1fa4a82ced15516a20105abb40 (diff) | |
download | cpython-5364e2e46f7566e1917d013f83c431a72de76009.zip cpython-5364e2e46f7566e1917d013f83c431a72de76009.tar.gz cpython-5364e2e46f7566e1917d013f83c431a72de76009.tar.bz2 |
A new crasher.
Diffstat (limited to 'Lib/test/crashers')
-rw-r--r-- | Lib/test/crashers/mutation_inside_cyclegc.py | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/Lib/test/crashers/mutation_inside_cyclegc.py b/Lib/test/crashers/mutation_inside_cyclegc.py new file mode 100644 index 0000000..2b67398 --- /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[:]) |