[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