Author: Brian Kearns <bdkea...@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, []) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit