[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