Author: Manuel Jacob <[email protected]>
Branch: py3.5
Changeset: r90577:068708147f9e
Date: 2017-03-05 21:41 +0100
http://bitbucket.org/pypy/pypy/changeset/068708147f9e/

Log:    Implement PEP 475 in the optimized path of readinto_w.

diff --git a/pypy/module/_io/interp_fileio.py b/pypy/module/_io/interp_fileio.py
--- a/pypy/module/_io/interp_fileio.py
+++ b/pypy/module/_io/interp_fileio.py
@@ -468,26 +468,26 @@
                 except OSError as e:
                     if e.errno == errno.EAGAIN:
                         return space.w_None
-                    wrap_oserror(space, e,
-                                 exception_name='w_IOError',
+                    wrap_oserror(space, e, exception_name='w_IOError',
                                  eintr_retry=True)
             rwbuffer.setslice(0, buf)
             return space.newint(len(buf))
         else:
             # optimized case: reading more than 64 bytes into a rwbuffer
             # with a valid raw address
-            # XXX TODO(mjacob): implement PEP 475 here!
-            got = c_read(self.fd, target_address, length)
-            keepalive_until_here(rwbuffer)
-            got = rffi.cast(lltype.Signed, got)
-            if got >= 0:
-                return space.newint(got)
-            else:
-                err = get_saved_errno()
-                if err == errno.EAGAIN:
-                    return space.w_None
-                e = OSError(err, "read failed")
-                raise wrap_oserror(space, e, exception_name='w_IOError')
+            while True:
+                got = c_read(self.fd, target_address, length)
+                keepalive_until_here(rwbuffer)
+                got = rffi.cast(lltype.Signed, got)
+                if got >= 0:
+                    return space.newint(got)
+                else:
+                    err = get_saved_errno()
+                    if err == errno.EAGAIN:
+                        return space.w_None
+                    e = OSError(err, "read failed")
+                    wrap_oserror(space, e, exception_name='w_IOError',
+                                 eintr_retry=True)
 
     def readall_w(self, space):
         self._check_closed(space)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to