Author: Brian Kearns <bdkea...@gmail.com> Branch: use-file-star-for-file Changeset: r73152:58d64536f9b4 Date: 2014-08-29 01:19 -0400 http://bitbucket.org/pypy/pypy/changeset/58d64536f9b4/
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 @@ -3,7 +3,7 @@ python builtin open() """ -import os +import os, stat, errno from rpython.rlib import rposix from rpython.rlib.rarithmetic import intmask from rpython.rlib.rstring import StringBuilder @@ -79,9 +79,20 @@ def _error(ll_file): - errno = c_ferror(ll_file) + err = c_ferror(ll_file) c_clearerr(ll_file) - raise OSError(errno, os.strerror(errno)) + raise OSError(err, os.strerror(err)) + + +def _dircheck(ll_file): + try: + st = os.fstat(c_fileno(ll_file)) + except OSError: + pass + else: + if stat.S_ISDIR(st[0]): + err = errno.EISDIR + raise OSError(err, os.strerror(err)) def create_file(filename, mode="r", buffering=-1): @@ -97,6 +108,7 @@ lltype.free(ll_mode, flavor='raw') finally: lltype.free(ll_name, flavor='raw') + _dircheck(ll_f) if buffering >= 0: if buffering == 0: c_setvbuf(ll_f, lltype.nullptr(rffi.CCHARP.TO), _IONBF, 0) @@ -124,6 +136,7 @@ raise OSError(errno, os.strerror(errno)) finally: lltype.free(ll_mode, flavor='raw') + _dircheck(ll_f) return RFile(ll_f) @@ -190,7 +203,9 @@ # XXX CPython uses a more delicate logic here self._check_closed() ll_file = self.ll_file - if size < 0: + if size == 0: + return "" + elif size < 0: # read the entire contents buf = lltype.malloc(rffi.CCHARP.TO, BASE_BUF_SIZE, flavor='raw') try: @@ -206,7 +221,7 @@ s.append_charpsize(buf, returned_size) finally: lltype.free(buf, flavor='raw') - else: + else: # size > 0 with rffi.scoped_alloc_buffer(size) as buf: returned_size = c_fread(buf.raw, 1, size, ll_file) returned_size = intmask(returned_size) # is between 0 and size 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 @@ -1,4 +1,4 @@ -import os, sys, py +import os, sys, py, errno from rpython.rtyper.test.tool import BaseRtypingTest from rpython.tool.udir import udir from rpython.rlib import rfile @@ -17,9 +17,37 @@ f.write("dupa") f.close() + f() self.interpret(f, []) assert open(fname, "r").read() == "dupa" + def test_open_errors(self): + def f(): + try: + open('zzz') + except OSError as e: + assert e.errno == errno.ENOENT + else: + assert False + + try: + open('.') + except OSError as e: + assert e.errno == errno.EISDIR + else: + assert False + + fd = os.open('.', os.O_RDONLY, 0777) + try: + os.fdopen(fd) + except OSError as e: + assert e.errno == errno.EISDIR + else: + assert False + os.close(fd) + + self.interpret(f, []) + def test_open_buffering_line(self): fname = str(self.tmpdir.join('file_1a')) @@ -60,6 +88,8 @@ 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) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit