[pypy-commit] pypy py3.5: Copy more closely the logic of CPython 3.5 for 'closefd' inside FileIO.__init__()

arigo pypy.commits at gmail.com
Sun Jan 22 11:44:06 EST 2017


Author: Armin Rigo <arigo at tunes.org>
Branch: py3.5
Changeset: r89688:983e1e1ee62f
Date: 2017-01-22 17:43 +0100
http://bitbucket.org/pypy/pypy/changeset/983e1e1ee62f/

Log:	Copy more closely the logic of CPython 3.5 for 'closefd' inside
	FileIO.__init__()

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
@@ -145,7 +145,12 @@
 
     @unwrap_spec(mode=str, closefd=int)
     def descr_init(self, space, w_name, mode='r', closefd=True, w_opener=None):
-        self._close(space)
+        if self.fd >= 0:
+            if self.closefd:
+                self._close(space)
+            else:
+                self.fd = -1
+
         if space.isinstance_w(w_name, space.w_float):
             raise oefmt(space.w_TypeError,
                         "integer argument expected, got float")
@@ -168,48 +173,52 @@
             if fd >= 0:
                 self.fd = fd
                 self.closefd = bool(closefd)
-            elif space.is_none(w_opener):
+            else:
                 self.closefd = True
                 if not closefd:
                     raise oefmt(space.w_ValueError,
                                 "Cannot use closefd=False with file name")
 
-                from pypy.module.posix.interp_posix import dispatch_filename
-                while True:
+                if space.is_none(w_opener):
+                    from pypy.module.posix.interp_posix import dispatch_filename
+                    while True:
+                        try:
+                            self.fd = dispatch_filename(rposix.open)(
+                                space, w_name, flags, 0666)
+                            fd_is_own = True
+                            break
+                        except OSError as e:
+                            wrap_oserror2(space, e, w_name,
+                                          exception_name='w_IOError',
+                                          eintr_retry=True)
+                    if not rposix._WIN32:
+                        try:
+                            _open_inhcache.set_non_inheritable(self.fd)
+                        except OSError as e:
+                            raise wrap_oserror2(space, e, w_name,
+                                                eintr_retry=False)
+                else:
+                    w_fd = space.call_function(w_opener, w_name,
+                                               space.wrap(flags))
                     try:
-                        self.fd = dispatch_filename(rposix.open)(
-                            space, w_name, flags, 0666)
+                        self.fd = space.int_w(w_fd)
+                        if self.fd < 0:
+                            # The opener returned a negative result instead
+                            # of raising an exception
+                            raise oefmt(space.w_ValueError,
+                                        "opener returned %d", self.fd)
                         fd_is_own = True
-                        break
-                    except OSError as e:
-                        wrap_oserror2(space, e, w_name,
-                                      exception_name='w_IOError',
-                                      eintr_retry=True)
-                if not rposix._WIN32:
-                    try:
-                        _open_inhcache.set_non_inheritable(self.fd)
-                    except OSError as e:
-                        raise wrap_oserror2(space, e, w_name, eintr_retry=False)
-            else:
-                w_fd = space.call_function(w_opener, w_name, space.wrap(flags))
-                try:
-                    self.fd = space.int_w(w_fd)
-                    if self.fd < 0:
-                        # The opener returned a negative result instead
-                        # of raising an exception
-                        raise oefmt(space.w_ValueError,
-                                    "opener returned %d", self.fd)
-                    fd_is_own = True
-                except OperationError as e:
-                    if not e.match(space, space.w_TypeError):
-                        raise
-                    raise oefmt(space.w_TypeError,
-                                "expected integer from opener")
-                if not rposix._WIN32:
-                    try:
-                        rposix.set_inheritable(self.fd, False)
-                    except OSError as e:
-                        raise wrap_oserror2(space, e, w_name, eintr_retry=False)
+                    except OperationError as e:
+                        if not e.match(space, space.w_TypeError):
+                            raise
+                        raise oefmt(space.w_TypeError,
+                                    "expected integer from opener")
+                    if not rposix._WIN32:
+                        try:
+                            rposix.set_inheritable(self.fd, False)
+                        except OSError as e:
+                            raise wrap_oserror2(space, e, w_name,
+                                                eintr_retry=False)
 
             try:
                 st = os.fstat(self.fd)


More information about the pypy-commit mailing list