Patch 1012740: cStringIO's truncate doesn't

truncate() left the stream position unchanged, which meant the
"truncated" data didn't go away:

>>> io.write('abc')
>>> io.truncate(0)
>>> io.write('xyz')
>>> io.getvalue()
'abcxyz'

Patch by Dima Dorfman.
This commit is contained in:
Tim Peters 2004-08-21 06:55:43 +00:00
parent 7109b287cf
commit 037b3ee44e
3 changed files with 9 additions and 2 deletions

View file

@ -49,9 +49,10 @@ class TestGenericStringIO(unittest.TestCase):
f.seek(10)
f.truncate()
eq(f.getvalue(), 'abcdefghij')
f.seek(0)
f.truncate(5)
eq(f.getvalue(), 'abcde')
f.write('xyz')
eq(f.getvalue(), 'abcdexyz')
f.close()
self.assertRaises(ValueError, f.write, 'frobnitz')

View file

@ -41,6 +41,11 @@ Core and builtins
Extension modules
-----------------
- Patch 1012740: truncate() on a writeable cStringIO now resets the
position to the end of the stream. This is consistent with the original
StringIO module and avoids inadvertently resurrecting data that was
supposed to have been truncated away.
- Added socket.socketpair().
Library

View file

@ -289,6 +289,7 @@ IO_truncate(IOobject *self, PyObject *args) {
if (pos < 0) pos = self->pos;
if (self->string_size > pos) self->string_size = pos;
self->pos = self->string_size;
Py_INCREF(Py_None);
return Py_None;