[pypy-commit] pypy use-file-star-for-file: use mode check from rfile

bdkearns noreply at buildbot.pypy.org
Fri Aug 29 09:36:48 CEST 2014


Author: Brian Kearns <bdkearns at gmail.com>
Branch: use-file-star-for-file
Changeset: r73160:98475f7b0785
Date: 2014-08-29 03:34 -0400
http://bitbucket.org/pypy/pypy/changeset/98475f7b0785/

Log:	use mode check from rfile

diff --git a/pypy/module/_file/interp_file.py b/pypy/module/_file/interp_file.py
--- a/pypy/module/_file/interp_file.py
+++ b/pypy/module/_file/interp_file.py
@@ -59,12 +59,6 @@
         self.binary = "b" in mode
         getopenstreams(self.space)[stream] = None
 
-    def check_mode_ok(self, mode):
-        if (not mode or mode[0] not in ['r', 'w', 'a', 'U'] or
-            ('U' in mode and ('w' in mode or 'a' in mode))):
-            space = self.space
-            raise oefmt(space.w_ValueError, "invalid mode: '%s'", mode)
-
     def check_closed(self):
         if self.stream is None:
             raise OperationError(self.space.w_ValueError,
@@ -95,7 +89,6 @@
     @unwrap_spec(mode=str, buffering=int)
     def direct___init__(self, w_name, mode='r', buffering=-1):
         self.direct_close()
-        self.check_mode_ok(mode)
         self.w_name = w_name
         stream = rfile.create_file(fsencode_w(self.space, w_name), mode, buffering)
         self.fdopenstream(stream, mode)
@@ -112,7 +105,6 @@
 
     def direct_fdopen(self, fd, mode='r', buffering=-1):
         self.direct_close()
-        self.check_mode_ok(mode)
         self.w_name = self.space.wrap('<fdopen>')
         stream = rfile.create_fdopen_rfile(fd, mode)
         self.fdopenstream(stream, mode)
@@ -230,6 +222,8 @@
     def file_fdopen(self, fd, mode="r", buffering=-1):
         try:
             self.direct_fdopen(fd, mode, buffering)
+        except ValueError as e:
+            raise OperationError(self.space.w_ValueError, self.space.wrap(str(e)))
         except OSError as e:
             raise wrap_oserror(self.space, e)
 
@@ -267,6 +261,8 @@
                 try:
                     try:
                         result = self.direct_%(name)s(%(callsig)s)
+                    except ValueError as e:
+                        raise OperationError(space.w_ValueError, space.wrap(str(e)))
                     except OSError as e:
                         raise wrap_oserror_as_ioerror(self.space, e, self.w_name)
                 finally:
diff --git a/pypy/module/_file/test/test_file.py b/pypy/module/_file/test/test_file.py
--- a/pypy/module/_file/test/test_file.py
+++ b/pypy/module/_file/test/test_file.py
@@ -72,6 +72,8 @@
         except AttributeError:
             fdopen = os.fdopen      # when running with -A
         fd = os.open(self.temppath, os.O_WRONLY | os.O_CREAT)
+        exc = raises(ValueError, fdopen, fd, "badmode")
+        assert str(exc.value) == "mode string must begin with one of 'r', 'w', 'a' or 'U', not 'badmode'"
         f2 = fdopen(fd, "a")
         f2.seek(0, 2)
         f2.write("bar\nboo")


More information about the pypy-commit mailing list