# HG changeset patch # Parent ca54c27a9045c655ef1ad9ce248f02eb00137476 diff -r ca54c27a9045 -r ba8c5a38f856 Modules/_io/fileio.c --- a/Modules/_io/fileio.c Tue Aug 21 14:54:22 2012 +0100 +++ b/Modules/_io/fileio.c Wed Aug 22 11:05:33 2012 +0100 @@ -615,10 +615,6 @@ if (!_PyVerify_fd(self->fd)) return PyErr_SetFromErrno(PyExc_IOError); - result = PyBytes_FromStringAndSize(NULL, SMALLCHUNK); - if (result == NULL) - return NULL; - #ifdef HAVE_FSTAT #if defined(MS_WIN64) || defined(MS_WINDOWS) pos = _lseeki64(self->fd, 0L, SEEK_CUR); @@ -629,13 +625,21 @@ end = st.st_size; else end = (Py_off_t)-1; + if (end <= 0) #endif + { + _Py_IDENTIFIER(readall); + return _PyObject_CallMethodId((PyObject*)&PyRawIOBase_Type, + &PyId_readall, "O", self); + } + +#ifdef HAVE_FSTAT + result = PyBytes_FromStringAndSize(NULL, SMALLCHUNK); + if (result == NULL) + return NULL; + while (1) { -#ifdef HAVE_FSTAT newsize = new_buffersize(self, total, pos, end); -#else - newsize = new_buffersize(self, total); -#endif if (newsize > PY_SSIZE_T_MAX || newsize <= 0) { PyErr_SetString(PyExc_OverflowError, "unbounded read returned more bytes " @@ -681,9 +685,7 @@ return NULL; } total += n; -#ifdef HAVE_FSTAT pos += n; -#endif } if (PyBytes_GET_SIZE(result) > total) { @@ -694,6 +696,7 @@ } } return result; +#endif } static PyObject *