[pypy-commit] pypy py3.5: io.BufferedRandom also uses the new readinto() implementation

rlamy pypy.commits at gmail.com
Wed Nov 22 13:32:16 EST 2017


Author: Ronan Lamy <ronan.lamy at gmail.com>
Branch: py3.5
Changeset: r93122:70b9b696e219
Date: 2017-11-22 18:32 +0000
http://bitbucket.org/pypy/pypy/changeset/70b9b696e219/

Log:	io.BufferedRandom also uses the new readinto() implementation

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
@@ -869,19 +869,14 @@
             finally:
                 self._reader_reset_buf()
 
-class W_BufferedReader(BufferedMixin, W_BufferedIOBase):
-    @unwrap_spec(buffer_size=int)
-    def descr_init(self, space, w_raw, buffer_size=DEFAULT_BUFFER_SIZE):
-        self.state = STATE_ZERO
-        check_readable_w(space, w_raw)
+class BufferedReaderMixin(BufferedMixin):
+    _mixin_ = True
 
-        self.w_raw = w_raw
-        self.buffer_size = buffer_size
-        self.readable = True
+    def readinto_w(self, space, w_buffer):
+        return self._readinto(space, w_buffer, read_once=False)
 
-        self._init(space)
-        self._reader_reset_buf()
-        self.state = STATE_OK
+    def readinto1_w(self, space, w_buffer):
+        return self._readinto(space, w_buffer, read_once=True)
 
     def _readinto(self, space, w_buffer, read_once):
         rwbuffer = space.writebuf_w(w_buffer)
@@ -904,7 +899,8 @@
                 self.pos = 0
                 if written + len(self.buffer) < length:
                     try:
-                        got = self._raw_read(space, rwbuffer, written, length - written)
+                        got = self._raw_read(
+                            space, rwbuffer, written, length - written)
                         written += got
                     except BlockingIOError:
                         got = 0
@@ -929,6 +925,19 @@
             return space.newint(written)
 
 
+class W_BufferedReader(BufferedReaderMixin, W_BufferedIOBase):
+    @unwrap_spec(buffer_size=int)
+    def descr_init(self, space, w_raw, buffer_size=DEFAULT_BUFFER_SIZE):
+        self.state = STATE_ZERO
+        check_readable_w(space, w_raw)
+
+        self.w_raw = w_raw
+        self.buffer_size = buffer_size
+        self.readable = True
+
+        self._init(space)
+        self._reader_reset_buf()
+        self.state = STATE_OK
 
 W_BufferedReader.typedef = TypeDef(
     '_io.BufferedReader', W_BufferedIOBase.typedef,
@@ -939,6 +948,8 @@
     read = interp2app(W_BufferedReader.read_w),
     peek = interp2app(W_BufferedReader.peek_w),
     read1 = interp2app(W_BufferedReader.read1_w),
+    readinto = interp2app(W_BufferedReader.readinto_w),
+    readinto1 = interp2app(W_BufferedReader.readinto1_w),
     raw = interp_attrproperty_w("w_raw", cls=W_BufferedReader),
     readline = interp2app(W_BufferedReader.readline_w),
 
@@ -1100,7 +1111,7 @@
     **methods
 )
 
-class W_BufferedRandom(BufferedMixin, W_BufferedIOBase):
+class W_BufferedRandom(BufferedReaderMixin, W_BufferedIOBase):
     @unwrap_spec(buffer_size=int)
     def descr_init(self, space, w_raw, buffer_size=DEFAULT_BUFFER_SIZE):
         self.state = STATE_ZERO
@@ -1128,6 +1139,8 @@
     peek = interp2app(W_BufferedRandom.peek_w),
     read1 = interp2app(W_BufferedRandom.read1_w),
     readline = interp2app(W_BufferedRandom.readline_w),
+    readinto = interp2app(W_BufferedRandom.readinto_w),
+    readinto1 = interp2app(W_BufferedRandom.readinto1_w),
 
     write = interp2app(W_BufferedRandom.write_w),
     flush = interp2app(W_BufferedRandom.flush_w),
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
@@ -199,6 +199,19 @@
             def readinto(self, buf):
                 buf[:3] = b"abc"
                 return 3
+
+            def writable(self):
+                return True
+
+            def write(self, b):
+                return len(b)
+
+            def seekable(self):
+                return True
+
+            def seek(self, pos, whence):
+                return 0
+
         bufio = _io.BufferedReader(MockIO(), buffer_size=5)
         buf = bytearray(10)
         bufio.read(2)
@@ -223,6 +236,15 @@
         assert n == 1
         assert buf[:n] == b'c'
 
+        bufio = _io.BufferedRandom(MockIO(), buffer_size=10)
+        buf = bytearray(20)
+        bufio.peek(3)
+        assert bufio.readinto1(buf) == 6
+        assert buf[:6] == b'abcabc'
+
+        bufio = _io.BufferedWriter(MockIO(), buffer_size=10)
+        raises(_io.UnsupportedOperation, bufio.readinto1, bytearray(10))
+
     def test_seek(self):
         import _io
         raw = _io.FileIO(self.tmpfile)


More information about the pypy-commit mailing list