[Python-checkins] cpython: backout 0fb7789b5eeb for test breakage (#20578)

benjamin.peterson python-checkins at python.org
Sun Jun 8 08:18:21 CEST 2014


http://hg.python.org/cpython/rev/b1e99b4ec374
changeset:   91083:b1e99b4ec374
user:        Benjamin Peterson <benjamin at python.org>
date:        Sat Jun 07 23:18:12 2014 -0700
summary:
  backout 0fb7789b5eeb for test breakage (#20578)

files:
  Doc/library/io.rst       |  31 ++--------
  Lib/_pyio.py             |  83 +---------------------------
  Lib/test/test_io.py      |  25 --------
  Misc/NEWS                |   2 -
  Modules/_io/bufferedio.c |  67 ++--------------------
  5 files changed, 14 insertions(+), 194 deletions(-)


diff --git a/Doc/library/io.rst b/Doc/library/io.rst
--- a/Doc/library/io.rst
+++ b/Doc/library/io.rst
@@ -385,8 +385,8 @@
    .. method:: readinto(b)
 
       Read up to ``len(b)`` bytes into :class:`bytearray` *b* and return the
-      number of bytes read.  If the object is in non-blocking mode and no bytes
-      are available, ``None`` is returned.
+      number of bytes read.  If the object is in non-blocking mode and no
+      bytes are available, ``None`` is returned.
 
    .. method:: write(b)
 
@@ -459,11 +459,10 @@
 
    .. method:: read1(size=-1)
 
-      Read and return up to *size* bytes, with at most one call to the
-      underlying raw stream's :meth:`~RawIOBase.read` (or
-      :meth:`~RawIOBase.readinto`) method.  This can be useful if you
-      are implementing your own buffering on top of a
-      :class:`BufferedIOBase` object.
+      Read and return up to *size* bytes, with at most one call to the underlying
+      raw stream's :meth:`~RawIOBase.read` method.  This can be useful if you
+      are implementing your own buffering on top of a :class:`BufferedIOBase`
+      object.
 
    .. method:: readinto(b)
 
@@ -473,19 +472,8 @@
       Like :meth:`read`, multiple reads may be issued to the underlying raw
       stream, unless the latter is interactive.
 
-      A :exc:`BlockingIOError` is raised if the underlying raw stream is in non
-      blocking-mode, and has no data available at the moment.
-
-   .. method:: readinto1(b)
-
-      Read up to ``len(b)`` bytes into bytearray *b*, using at most one call to
-      the underlying raw stream's :meth:`~RawIOBase.read` (or
-      :meth:`~RawIOBase.readinto`) method. Return the number of bytes read.
-
       A :exc:`BlockingIOError` is raised if the underlying raw stream is in
-      non-blocking mode and has no data available at the moment.
-
-      .. versionadded:: 3.5
+      non blocking-mode, and has no data available at the moment.
 
    .. method:: write(b)
 
@@ -602,11 +590,6 @@
 
       In :class:`BytesIO`, this is the same as :meth:`read`.
 
-   .. method:: readinto1()
-
-      In :class:`BytesIO`, this is the same as :meth:`readinto`.
-
-      .. versionadded:: 3.5
 
 .. class:: BufferedReader(raw, buffer_size=DEFAULT_BUFFER_SIZE)
 
diff --git a/Lib/_pyio.py b/Lib/_pyio.py
--- a/Lib/_pyio.py
+++ b/Lib/_pyio.py
@@ -655,26 +655,8 @@
         Raises BlockingIOError if the underlying raw stream has no
         data at the moment.
         """
-
-        return self._readinto(b, read1=False)
-
-    def readinto1(self, b):
-        """Read up to len(b) bytes into *b*, using at most one system call
-
-        Returns an int representing the number of bytes read (0 for EOF).
-
-        Raises BlockingIOError if the underlying raw stream has no
-        data at the moment.
-        """
-
-        return self._readinto(b, read1=True)
-
-    def _readinto(self, b, read1):
         # XXX This ought to work with anything that supports the buffer API
-        if read1:
-            data = self.read1(len(b))
-        else:
-            data = self.read(len(b))
+        data = self.read(len(b))
         n = len(data)
         try:
             b[:n] = data
@@ -1076,62 +1058,6 @@
             return self._read_unlocked(
                 min(size, len(self._read_buf) - self._read_pos))
 
-    # Implementing readinto() and readinto1() is not strictly necessary (we
-    # could rely on the base class that provides an implementation in terms of
-    # read() and read1()). We do ai anyway to keep the _pyio implementation
-    # similar to the io implementation (which implements the methods for
-    # performance reasons).
-    def readinto(self, buf):
-        """Read data into *buf*."""
-        return self._readinto(buf, read1=False)
-    def readinto1(self, buf):
-        """Read data into *buf* with at most one system call."""
-        return self._readinto(buf, read1=True)
-
-    def _readinto(self, buf, read1):
-        """Read data into *buf* with at most one system call."""
-
-        if len(buf) == 0:
-            return 0
-
-        written = 0
-        with self._read_lock:
-            while written < len(buf):
-
-                # First try to read from internal buffer
-                avail = min(len(self._read_buf) - self._read_pos, len(buf))
-                if avail:
-                    buf[written:written+avail] = \
-                        self._read_buf[self._read_pos:self._read_pos+avail]
-                    self._read_pos += avail
-                    written += avail
-                    if written == len(buf):
-                        break
-
-                # If remaining space in callers buffer is larger than
-                # internal buffer, read directly into callers buffer
-                if len(buf) - written > self.buffer_size:
-                    # If we don't use a memoryview, slicing buf will create
-                    # a new object
-                    if not isinstance(buf, memoryview):
-                        buf = memoryview(buf)
-                    n = self.raw.readinto(buf[written:])
-                    if not n:
-                        break # eof
-                    written += n
-
-                # Otherwise refill internal buffer - unless we're
-                # in read1 mode and already got some data
-                elif not (read1 and written):
-                    if not self._peek_unlocked(1):
-                        break # eof
-
-                # In readinto1 mode, return as soon as we have some data
-                if read1 and written:
-                    break
-
-        return written
-
     def tell(self):
         return _BufferedIOMixin.tell(self) - len(self._read_buf) + self._read_pos
 
@@ -1281,9 +1207,6 @@
     def read1(self, size):
         return self.reader.read1(size)
 
-    def readinto1(self, b):
-        return self.reader.readinto1(b)
-
     def readable(self):
         return self.reader.readable()
 
@@ -1366,10 +1289,6 @@
         self.flush()
         return BufferedReader.read1(self, size)
 
-    def readinto1(self, b):
-        self.flush()
-        return BufferedReader.readinto1(self, b)
-
     def write(self, b):
         if self._read_buf:
             # Undo readahead
diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py
--- a/Lib/test/test_io.py
+++ b/Lib/test/test_io.py
@@ -911,29 +911,6 @@
         self.assertEqual(bufio.readinto(b), 1)
         self.assertEqual(b, b"cb")
 
-    def test_readinto1(self):
-        buffer_size = 10
-        rawio = self.MockRawIO((b"abc", b"de", b"fgh", b"jkl"))
-        bufio = self.tp(rawio, buffer_size=buffer_size)
-        b = bytearray(2)
-        self.assertEqual(bufio.peek(3), b'abc')
-        self.assertEqual(rawio._reads, 1)
-        self.assertEqual(bufio.readinto1(b), 2)
-        self.assertEqual(b, b"ab")
-        self.assertEqual(rawio._reads, 1)
-        self.assertEqual(bufio.readinto1(b), 1)
-        self.assertEqual(b[:1], b"c")
-        self.assertEqual(rawio._reads, 1)
-        self.assertEqual(bufio.readinto1(b), 2)
-        self.assertEqual(b, b"de")
-        self.assertEqual(rawio._reads, 2)
-        b = bytearray(2*buffer_size)
-        self.assertEqual(bufio.peek(3), b'fgh')
-        self.assertEqual(rawio._reads, 3)
-        self.assertEqual(bufio.readinto1(b), 6)
-        self.assertEqual(b[:6], b"fghjkl")
-        self.assertEqual(rawio._reads, 4)
-
     def test_readlines(self):
         def bufio():
             rawio = self.MockRawIO((b"abc\n", b"d\n", b"ef"))
@@ -3008,8 +2985,6 @@
                 self.assertRaises(ValueError, f.readall)
             if hasattr(f, "readinto"):
                 self.assertRaises(ValueError, f.readinto, bytearray(1024))
-            if hasattr(f, "readinto1"):
-                self.assertRaises(ValueError, f.readinto1, bytearray(1024))
             self.assertRaises(ValueError, f.readline)
             self.assertRaises(ValueError, f.readlines)
             self.assertRaises(ValueError, f.seek, 0)
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -92,8 +92,6 @@
 Library
 -------
 
-- Issue #20578: Add io.BufferedIOBase.readinto1.
-
 - Issue #11709: Fix the pydoc.help function to not fail when sys.stdin is not a
   valid file.
 
diff --git a/Modules/_io/bufferedio.c b/Modules/_io/bufferedio.c
--- a/Modules/_io/bufferedio.c
+++ b/Modules/_io/bufferedio.c
@@ -24,7 +24,6 @@
 _Py_IDENTIFIER(read1);
 _Py_IDENTIFIER(readable);
 _Py_IDENTIFIER(readinto);
-_Py_IDENTIFIER(readinto1);
 _Py_IDENTIFIER(writable);
 _Py_IDENTIFIER(write);
 
@@ -48,21 +47,17 @@
     );
 
 static PyObject *
-_bufferediobase_readinto_generic(PyObject *self, PyObject *args, char readinto1)
+bufferediobase_readinto(PyObject *self, PyObject *args)
 {
     Py_buffer buf;
     Py_ssize_t len;
     PyObject *data;
 
-    if (!PyArg_ParseTuple(args,
-                          readinto1 ? "w*:readinto1" : "w*:readinto",
-                          &buf)) {
+    if (!PyArg_ParseTuple(args, "w*:readinto", &buf)) {
         return NULL;
     }
 
-    data = _PyObject_CallMethodId(self,
-                                  readinto1 ? &PyId_read1 : &PyId_read,
-                                  "n", buf.len);
+    data = _PyObject_CallMethodId(self, &PyId_read, "n", buf.len);
     if (data == NULL)
         goto error;
 
@@ -94,18 +89,6 @@
 }
 
 static PyObject *
-bufferediobase_readinto(PyObject *self, PyObject *args)
-{
-    return _bufferediobase_readinto_generic(self, args, 0);
-}
-
-static PyObject *
-bufferediobase_readinto1(PyObject *self, PyObject *args)
-{
-    return _bufferediobase_readinto_generic(self, args, 1);
-}
-
-static PyObject *
 bufferediobase_unsupported(const char *message)
 {
     _PyIO_State *state = IO_STATE();
@@ -184,7 +167,6 @@
     {"read", bufferediobase_read, METH_VARARGS, bufferediobase_read_doc},
     {"read1", bufferediobase_read1, METH_VARARGS, bufferediobase_read1_doc},
     {"readinto", bufferediobase_readinto, METH_VARARGS, NULL},
-    {"readinto1", bufferediobase_readinto1, METH_VARARGS, NULL},
     {"write", bufferediobase_write, METH_VARARGS, bufferediobase_write_doc},
     {NULL, NULL}
 };
@@ -1006,7 +988,7 @@
 }
 
 static PyObject *
-_buffered_readinto_generic(buffered *self, PyObject *args, char readinto1)
+buffered_readinto(buffered *self, PyObject *args)
 {
     Py_buffer buf;
     Py_ssize_t n, written = 0, remaining;
@@ -1014,9 +996,7 @@
 
     CHECK_INITIALIZED(self)
 
-    if (!PyArg_ParseTuple(args,
-                          readinto1 ? "w*:readinto1" : "w*:readinto",
-                          &buf))
+    if (!PyArg_ParseTuple(args, "w*:readinto", &buf))
         return NULL;
 
     n = Py_SAFE_DOWNCAST(READAHEAD(self), Py_off_t, Py_ssize_t);
@@ -1054,10 +1034,7 @@
             n = _bufferedreader_raw_read(self, (char *) buf.buf + written,
                                          remaining);
         }
-
-        /* In readinto1 mode, we do not want to fill the internal
-           buffer if we already have some data to return */
-        else if (!(readinto1 && written)) {
+        else {
             n = _bufferedreader_fill_buffer(self);
             if (n > 0) {
                 if (n > remaining)
@@ -1068,10 +1045,6 @@
                 continue; /* short circuit */
             }
         }
-        else {
-            n = 0;
-        }
-        
         if (n == 0 || (n == -2 && written > 0))
             break;
         if (n < 0) {
@@ -1081,12 +1054,6 @@
             }
             goto end;
         }
-        
-        /* At most one read in readinto1 mode */
-        if (readinto1) {
-            written += n;
-            break;
-        }
     }
     res = PyLong_FromSsize_t(written);
 
@@ -1098,19 +1065,6 @@
 }
 
 static PyObject *
-buffered_readinto(buffered *self, PyObject *args)
-{
-    return _buffered_readinto_generic(self, args, 0);
-}
-
-static PyObject *
-buffered_readinto1(buffered *self, PyObject *args)
-{
-    return _buffered_readinto_generic(self, args, 1);
-}
-
-
-static PyObject *
 _buffered_readline(buffered *self, Py_ssize_t limit)
 {
     PyObject *res = NULL;
@@ -1795,7 +1749,6 @@
     {"peek", (PyCFunction)buffered_peek, METH_VARARGS},
     {"read1", (PyCFunction)buffered_read1, METH_VARARGS},
     {"readinto", (PyCFunction)buffered_readinto, METH_VARARGS},
-    {"readinto1", (PyCFunction)buffered_readinto1, METH_VARARGS},
     {"readline", (PyCFunction)buffered_readline, METH_VARARGS},
     {"seek", (PyCFunction)buffered_seek, METH_VARARGS},
     {"tell", (PyCFunction)buffered_tell, METH_NOARGS},
@@ -2395,12 +2348,6 @@
 }
 
 static PyObject *
-bufferedrwpair_readinto1(rwpair *self, PyObject *args)
-{
-    return _forward_call(self->reader, &PyId_readinto1, args);
-}
-
-static PyObject *
 bufferedrwpair_write(rwpair *self, PyObject *args)
 {
     return _forward_call(self->writer, &PyId_write, args);
@@ -2465,7 +2412,6 @@
     {"peek", (PyCFunction)bufferedrwpair_peek, METH_VARARGS},
     {"read1", (PyCFunction)bufferedrwpair_read1, METH_VARARGS},
     {"readinto", (PyCFunction)bufferedrwpair_readinto, METH_VARARGS},
-    {"readinto1", (PyCFunction)bufferedrwpair_readinto1, METH_VARARGS},
 
     {"write", (PyCFunction)bufferedrwpair_write, METH_VARARGS},
     {"flush", (PyCFunction)bufferedrwpair_flush, METH_NOARGS},
@@ -2614,7 +2560,6 @@
     {"read", (PyCFunction)buffered_read, METH_VARARGS},
     {"read1", (PyCFunction)buffered_read1, METH_VARARGS},
     {"readinto", (PyCFunction)buffered_readinto, METH_VARARGS},
-    {"readinto1", (PyCFunction)buffered_readinto1, METH_VARARGS},
     {"readline", (PyCFunction)buffered_readline, METH_VARARGS},
     {"peek", (PyCFunction)buffered_peek, METH_VARARGS},
     {"write", (PyCFunction)bufferedwriter_write, METH_VARARGS},

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list