Author: Brian Kearns <bdkea...@gmail.com> Branch: stdlib-2.7.8 Changeset: r73085:d8cc30a1c503 Date: 2014-08-27 13:18 -0400 http://bitbucket.org/pypy/pypy/changeset/d8cc30a1c503/
Log: fix behavior of flush/close after write errors in line buffered streamio diff --git a/pypy/module/_file/test/test_file.py b/pypy/module/_file/test/test_file.py --- a/pypy/module/_file/test/test_file.py +++ b/pypy/module/_file/test/test_file.py @@ -269,6 +269,9 @@ try: f.write('hello') raises(IOError, f.write, '\n') + f.write('zzz') + raises(IOError, f.flush) + f.flush() finally: f.close() diff --git a/rpython/rlib/streamio.py b/rpython/rlib/streamio.py --- a/rpython/rlib/streamio.py +++ b/rpython/rlib/streamio.py @@ -731,16 +731,23 @@ def __init__(self, base, bufsize=-1): self.base = base - self.do_write = base.write # write more data self.do_tell = base.tell # return a byte offset if bufsize == -1: # Get default from the class bufsize = self.bufsize self.bufsize = bufsize # buffer size (hint only) self.buf = [] self.buflen = 0 + self.error = False + + def do_write(self, data): + try: + self.base.write(data) + except: + self.error = True + raise def flush_buffers(self): - if self.buf: + if self.buf and not self.error: self.do_write(''.join(self.buf)) self.buf = [] self.buflen = 0 @@ -749,6 +756,7 @@ return self.do_tell() + self.buflen def write(self, data): + self.error = False buflen = self.buflen datalen = len(data) if datalen + buflen < self.bufsize: @@ -783,6 +791,7 @@ """ def write(self, data): + self.error = False p = data.rfind('\n') + 1 assert p >= 0 if self.buflen + len(data) < self.bufsize: _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit