[pypy-svn] r78412 - in pypy/branch/fast-forward/pypy/module/_io: . test
afa at codespeak.net
afa at codespeak.net
Thu Oct 28 17:24:24 CEST 2010
Author: afa
Date: Thu Oct 28 17:24:23 2010
New Revision: 78412
Modified:
pypy/branch/fast-forward/pypy/module/_io/interp_bufferedio.py
pypy/branch/fast-forward/pypy/module/_io/test/test_bufferedio.py
Log:
implement truncate() on buffered files
Modified: pypy/branch/fast-forward/pypy/module/_io/interp_bufferedio.py
==============================================================================
--- pypy/branch/fast-forward/pypy/module/_io/interp_bufferedio.py (original)
+++ pypy/branch/fast-forward/pypy/module/_io/interp_bufferedio.py Thu Oct 28 17:24:23 2010
@@ -170,7 +170,9 @@
# Check if seeking leaves us inside the current buffer, so as to
# return quickly if possible. Also, we needn't take the lock in
# this fast path.
- current = self._raw_tell(space)
+ if self.abs_pos == -1:
+ self._raw_tell(space)
+ current = self.abs_pos
available = self._readahead()
if available > 0:
if whence == 0:
@@ -293,6 +295,23 @@
self._check_init(space)
return space.call_method(self.raw, "fileno")
+ @unwrap_spec('self', ObjSpace, W_Root)
+ def truncate_w(self, space, w_size=None):
+ self._check_init(space)
+ with self.lock:
+ if self.writable:
+ self._writer_flush_unlocked(space)
+ if self.readable:
+ if space.is_w(w_size, space.w_None):
+ # Rewind the raw stream so that its position corresponds
+ # to the current logical position
+ self._raw_seek(space, -self._raw_offset(), 1)
+ self._reader_reset_buf()
+ # invalidate cached position
+ self.abs_pos = -1
+
+ return space.call_method(self.raw, "truncate", w_size)
+
class W_BufferedReader(BufferedMixin, W_BufferedIOBase):
@unwrap_spec('self', ObjSpace, W_Root, int)
def descr_init(self, space, w_raw, buffer_size=DEFAULT_BUFFER_SIZE):
@@ -512,6 +531,7 @@
close = interp2app(W_BufferedReader.close_w),
flush = interp2app(W_BufferedReader.flush_w),
detach = interp2app(W_BufferedReader.detach_w),
+ truncate = interp2app(W_BufferedReader.truncate_w),
fileno = interp2app(W_BufferedReader.fileno_w),
closed = GetSetProperty(W_BufferedReader.closed_get_w),
)
@@ -673,6 +693,7 @@
close = interp2app(W_BufferedWriter.close_w),
fileno = interp2app(W_BufferedWriter.fileno_w),
detach = interp2app(W_BufferedWriter.detach_w),
+ truncate = interp2app(W_BufferedWriter.truncate_w),
closed = GetSetProperty(W_BufferedWriter.closed_get_w),
)
Modified: pypy/branch/fast-forward/pypy/module/_io/test/test_bufferedio.py
==============================================================================
--- pypy/branch/fast-forward/pypy/module/_io/test/test_bufferedio.py (original)
+++ pypy/branch/fast-forward/pypy/module/_io/test/test_bufferedio.py Thu Oct 28 17:24:23 2010
@@ -187,3 +187,11 @@
import gc; gc.collect()
assert record == [1, 2, 3]
+ def test_truncate(self):
+ import _io
+ raw = _io.FileIO(self.tmpfile, 'w+')
+ raw.write('x' * 20)
+ b = _io.BufferedReader(raw)
+ assert b.seek(8) == 8
+ assert b.truncate() == 8
+ assert b.tell() == 8
More information about the Pypy-commit
mailing list