mirror of
https://github.com/python/cpython.git
synced 2025-08-03 08:34:29 +00:00
Checkin Tim's fix to an error discussed on python-dev.
Also, add a testcase. Formerly, the list_extend() code used several local variables to remember its state across iterations. Since an iteration could call arbitrary Python code, it was possible for the list state to be changed. The new code uses dynamic structure references instead of C locals. So, they are always up-to-date. After list_resize() is called, its size has been updated but the new cells are filled with NULLs. These needed to be filled before arbitrary iteration code was called; otherwise, that code could attempt to modify a list that was in a semi-invalid state. The solution was to change the ob->size field back to a value reflecting the actual number of valid cells.
This commit is contained in:
parent
55593c3ef5
commit
aa241e0149
2 changed files with 25 additions and 10 deletions
|
@ -712,6 +712,11 @@ class BuiltinTest(unittest.TestCase):
|
|||
# http://sources.redhat.com/ml/newlib/2002/msg00369.html
|
||||
self.assertRaises(MemoryError, list, xrange(sys.maxint // 2))
|
||||
|
||||
# This code used to segfault in Py2.4a3
|
||||
x = []
|
||||
x.extend(-y for y in x)
|
||||
self.assertEqual(x, [])
|
||||
|
||||
def test_long(self):
|
||||
self.assertEqual(long(314), 314L)
|
||||
self.assertEqual(long(3.14), 3L)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue