[pypy-commit] pypy default: prevent streamio SEEK_SET from trashing the buffers for in-buffer seeks, fixes issue1234
bdkearns
noreply at buildbot.pypy.org
Wed Feb 13 07:33:49 CET 2013
Author: Brian Kearns <bdkearns at gmail.com>
Branch:
Changeset: r61162:66d1e56f69a4
Date: 2013-02-13 01:25 -0500
http://bitbucket.org/pypy/pypy/changeset/66d1e56f69a4/
Log: prevent streamio SEEK_SET from trashing the buffers for in-buffer
seeks, fixes issue1234
diff --git a/rpython/rlib/streamio.py b/rpython/rlib/streamio.py
--- a/rpython/rlib/streamio.py
+++ b/rpython/rlib/streamio.py
@@ -552,30 +552,26 @@
# This may fail on the do_seek() or do_tell() call.
# But it won't call either on a relative forward seek.
# Nor on a seek to the very end.
- if whence == 0:
- self.do_seek(offset, 0)
- self.buf = ""
- self.pos = 0
- return
- if whence == 1:
+ if whence == 0 or whence == 1:
currentsize = len(self.buf) - self.pos
- if offset < 0:
- if self.pos + offset >= 0:
- self.pos += offset
- else:
- self.do_seek(self.tell() + offset, 0)
- self.pos = 0
- self.buf = ""
- return
- elif offset <= currentsize:
- self.pos += offset
+ if whence == 0:
+ difpos = offset - self.tell()
+ else:
+ difpos = offset
+ if -self.pos <= difpos <= currentsize:
+ self.pos += difpos
return
self.buf = ""
self.pos = 0
- offset -= currentsize
+ if whence == 1:
+ offset -= currentsize
try:
- self.do_seek(offset, 1)
+ self.do_seek(offset, whence)
except MyNotImplementedError:
+ if difpos < 0:
+ raise
+ if whence == 0:
+ offset = difpos - currentsize
intoffset = offset2int(offset)
self.read(intoffset)
return
diff --git a/rpython/rlib/test/test_streamio.py b/rpython/rlib/test/test_streamio.py
--- a/rpython/rlib/test/test_streamio.py
+++ b/rpython/rlib/test/test_streamio.py
@@ -391,7 +391,7 @@
end = len(all)
cases = [(readto, seekto, whence) for readto in range(0, end+1)
for seekto in range(0, end+1)
- for whence in [1, 2]]
+ for whence in [0, 1, 2]]
random.shuffle(cases)
if isinstance(self, (LLRtypeMixin, OORtypeMixin)):
cases = cases[:7] # pick some cases at random - too slow!
@@ -401,16 +401,17 @@
file = streamio.BufferingInputStream(base)
head = file.read(readto)
assert head == all[:readto]
- offset = 42 # for the flow space
if whence == 1:
offset = seekto - readto
elif whence == 2:
offset = seekto - end
+ else:
+ offset = seekto
if whence == 2 and seekto < file.tell() or seekto < file.tell() - file.pos:
try:
file.seek(offset, whence)
except streamio.MyNotImplementedError:
- assert whence == 1
+ assert whence in (0, 1)
except streamio.StreamError:
assert whence == 2
else:
More information about the pypy-commit
mailing list