[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