Christian Heimes | 81ee3ef | 2008-05-04 22:42:01 +0000 | [diff] [blame] | 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 A(object): |
| 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[:]) |