Index: Lib/test/test_StringIO_jy.py =================================================================== --- Lib/test/test_StringIO_jy.py (revision 5912) +++ Lib/test/test_StringIO_jy.py (working copy) @@ -12,9 +12,17 @@ self.assertEqual(u'foo', cStringIO.StringIO(u'foo').read()) self.assertEqual('foo', cStringIO.StringIO(u'foo').read()) +class TestWrite(unittest.TestCase): + def test_write_seek_write(self): + f = cStringIO.StringIO() + f.write('hello') + f.seek(2) + f.write('hi') + self.assertEquals(f.getvalue(), 'hehio') def test_main(): test_support.run_unittest(TestUnicodeInput) + test_support.run_unittest(TestWrite) if __name__ == '__main__': test_main() Index: src/org/python/modules/cStringIO.java =================================================================== --- src/org/python/modules/cStringIO.java (revision 5912) +++ src/org/python/modules/cStringIO.java (working copy) @@ -325,9 +325,40 @@ public synchronized void write(String s) { _complain_ifclosed(); - buf.setLength(pos); - int newpos = pos + s.length(); - buf.replace(pos, newpos, s); + + int spos = pos; + int slen = buf.length(); + + if (spos == slen) { + buf.append(s); + buf.setLength(slen + s.length()); + pos = spos + s.length(); + + return; + } + + if (spos > slen) { + int l = spos - slen; + char[] bytes = new char[l]; + + for (int i = 0; i < l - 1; i++) + bytes[i] = '\0'; + + buf.append(bytes); + slen = spos; + } + + int newpos = spos + s.length(); + + if (newpos > slen) { + buf.replace(spos, slen - spos, s); + buf.append(s.substring(slen)); + slen = newpos; + } else { + buf.replace(spos, spos + s.length(), s); + } + + buf.setLength(slen); pos = newpos; }