Skip to content

Commit

Permalink
Fixes #1227 where for cStringIO.StringIO, orderings of method calls
Browse files Browse the repository at this point in the history
like write-seek-write did not properly work. This also addresses a
problem for PyAMF support.

Thanks go to Nick Joyce for the patch!
  • Loading branch information
jimbaker committed Jan 17, 2009
1 parent 9bab462 commit 7d0a071
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 3 deletions.
8 changes: 8 additions & 0 deletions Lib/test/test_StringIO_jy.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,17 @@ def test_differences_handling_unicode(self):
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()
37 changes: 34 additions & 3 deletions src/org/python/modules/cStringIO.java
Original file line number Diff line number Diff line change
Expand Up @@ -325,9 +325,40 @@ public void write(PyObject obj) {

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;
}

Expand Down

0 comments on commit 7d0a071

Please sign in to comment.