From: <zy...@us...> - 2009-01-17 18:13:00
|
Revision: 5937 http://jython.svn.sourceforge.net/jython/?rev=5937&view=rev Author: zyasoft Date: 2009-01-17 18:12:57 +0000 (Sat, 17 Jan 2009) Log Message: ----------- Fixes #1227 where for cStringIO.StringIO, orderings of method calls like write-seek-write did not properly work. This also addresses a problem for PyAMF support. Thanks go to Nick Joyce for the patch! Modified Paths: -------------- trunk/jython/Lib/test/test_StringIO_jy.py trunk/jython/src/org/python/modules/cStringIO.java Modified: trunk/jython/Lib/test/test_StringIO_jy.py =================================================================== --- trunk/jython/Lib/test/test_StringIO_jy.py 2009-01-16 09:17:19 UTC (rev 5936) +++ trunk/jython/Lib/test/test_StringIO_jy.py 2009-01-17 18:12:57 UTC (rev 5937) @@ -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() Modified: trunk/jython/src/org/python/modules/cStringIO.java =================================================================== --- trunk/jython/src/org/python/modules/cStringIO.java 2009-01-16 09:17:19 UTC (rev 5936) +++ trunk/jython/src/org/python/modules/cStringIO.java 2009-01-17 18:12:57 UTC (rev 5937) @@ -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; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |