[pypy-commit] pypy use-file-star-for-file: merge default

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


Author: Brian Kearns <bdkearns at gmail.com>
Branch: use-file-star-for-file
Changeset: r73159:07e7602306fb
Date: 2014-08-29 03:26 -0400
http://bitbucket.org/pypy/pypy/changeset/07e7602306fb/

Log:	merge default

diff --git a/rpython/rlib/rfile.py b/rpython/rlib/rfile.py
--- a/rpython/rlib/rfile.py
+++ b/rpython/rlib/rfile.py
@@ -95,7 +95,28 @@
             raise OSError(err, os.strerror(err))
 
 
+def _sanitize_mode(mode):
+    if len(mode) == 0:
+        raise ValueError("empty mode string")
+    upos = mode.find('U')
+    if upos >= 0:
+        mode = mode[:upos] + mode[upos+1:]
+        first = mode[0:1]
+        if first == 'w' or first == 'a':
+            raise ValueError("universal newline mode can only be used with "
+                             "modes starting with 'r'")
+        if first != 'r':
+            mode = 'r' + mode
+        if 'b' not in mode:
+            mode = mode[0] + 'b' + mode[1:]
+    elif mode[0] != 'r' and mode[0] != 'w' and mode[0] != 'a':
+        raise ValueError("mode string must begin with one of 'r', 'w', 'a' "
+                         "or 'U', not '%s'" % mode)
+    return mode
+
+
 def create_file(filename, mode="r", buffering=-1):
+    mode = _sanitize_mode(mode)
     ll_name = rffi.str2charp(filename)
     try:
         ll_mode = rffi.str2charp(mode)
@@ -128,6 +149,7 @@
 
 
 def create_fdopen_rfile(fd, mode="r"):
+    mode = _sanitize_mode(mode)
     ll_mode = rffi.str2charp(mode)
     try:
         ll_f = c_fdopen(rffi.cast(rffi.INT, fd), ll_mode)
diff --git a/rpython/rlib/test/test_rfile.py b/rpython/rlib/test/test_rfile.py
--- a/rpython/rlib/test/test_rfile.py
+++ b/rpython/rlib/test/test_rfile.py
@@ -24,6 +24,13 @@
     def test_open_errors(self):
         def f():
             try:
+                open('zzz', 'badmode')
+            except ValueError:
+                pass
+            else:
+                assert False
+
+            try:
                 open('zzz')
             except OSError as e:
                 assert e.errno == errno.ENOENT
@@ -37,6 +44,13 @@
             else:
                 assert False
 
+            try:
+                os.fdopen(42, "badmode")
+            except ValueError:
+                pass
+            else:
+                assert False
+
             fd = os.open('.', os.O_RDONLY, 0777)
             try:
                 os.fdopen(fd)
@@ -87,22 +101,23 @@
             f = open(fname, "w")
             f.write("dupa\x00dupb")
             f.close()
-            f2 = open(fname)
-            dupa = f2.read(0)
-            assert dupa == ""
-            dupa = f2.read()
-            assert dupa == "dupa\x00dupb"
-            f2.seek(0)
-            dupa = f2.readline(0)
-            assert dupa == ""
-            dupa = f2.readline(2)
-            assert dupa == "du"
-            dupa = f2.readline(100)
-            assert dupa == "pa\x00dupb"
-            f2.seek(0)
-            dupa = f2.readline()
-            assert dupa == "dupa\x00dupb"
-            f2.close()
+            for mode in ['r', 'U']:
+                f2 = open(fname, mode)
+                dupa = f2.read(0)
+                assert dupa == ""
+                dupa = f2.read()
+                assert dupa == "dupa\x00dupb"
+                f2.seek(0)
+                dupa = f2.readline(0)
+                assert dupa == ""
+                dupa = f2.readline(2)
+                assert dupa == "du"
+                dupa = f2.readline(100)
+                assert dupa == "pa\x00dupb"
+                f2.seek(0)
+                dupa = f2.readline()
+                assert dupa == "dupa\x00dupb"
+                f2.close()
 
         f()
         self.interpret(f, [])


More information about the pypy-commit mailing list