Author: Brian Kearns <[email protected]>
Branch:
Changeset: r61159:fa3dd6e22b8c
Date: 2013-02-13 00:21 -0500
http://bitbucket.org/pypy/pypy/changeset/fa3dd6e22b8c/
Log: test and fix for _io buffering: in buffer back seeks shouldn't trash
the buffer just because we have no forward buffer
diff --git a/pypy/module/_io/interp_bufferedio.py
b/pypy/module/_io/interp_bufferedio.py
--- a/pypy/module/_io/interp_bufferedio.py
+++ b/pypy/module/_io/interp_bufferedio.py
@@ -268,16 +268,15 @@
self._raw_tell(space)
current = self.abs_pos
available = self._readahead()
- if available > 0:
- if whence == 0:
- offset = pos - (current - self._raw_offset())
- else:
- offset = pos
- if -self.pos <= offset <= available:
- newpos = self.pos + offset
- assert newpos >= 0
- self.pos = newpos
- return space.wrap(current - available + offset)
+ if whence == 0:
+ offset = pos - (current - self._raw_offset())
+ else:
+ offset = pos
+ if -self.pos <= offset <= available:
+ newpos = self.pos + offset
+ assert newpos >= 0
+ self.pos = newpos
+ return space.wrap(current - available + offset)
# Fallback: invoke raw seek() method and clear buffer
with self.lock:
diff --git a/pypy/module/_io/test/test_bufferedio.py
b/pypy/module/_io/test/test_bufferedio.py
--- a/pypy/module/_io/test/test_bufferedio.py
+++ b/pypy/module/_io/test/test_bufferedio.py
@@ -153,6 +153,19 @@
assert f.read() == "\nc"
f.close()
+ def test_seek_nocall(self):
+ # test that when we're at the end of the buffer,
+ # an in-buffer back seek doesn't produce a raw seek
+ import _io
+ raw = _io.FileIO(self.tmpfile)
+ f = _io.BufferedReader(raw, buffer_size=3)
+ f.read(1)
+ f.seek(3, 0)
+ def failing_seek(*args):
+ assert False
+ raw.seek = failing_seek
+ f.seek(-1, 1)
+
def test_readlines(self):
import _io
raw = _io.FileIO(self.tmpfile)
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit