[pypy-commit] pypy use-file-star-for-file: check rfile mode readable/writable
bdkearns
noreply at buildbot.pypy.org
Thu Sep 11 09:50:19 CEST 2014
Author: Brian Kearns <bdkearns at gmail.com>
Branch: use-file-star-for-file
Changeset: r73449:2cdd638ae53b
Date: 2014-09-11 03:31 -0400
http://bitbucket.org/pypy/pypy/changeset/2cdd638ae53b/
Log: check rfile mode readable/writable
diff --git a/rpython/rlib/rfile.py b/rpython/rlib/rfile.py
--- a/rpython/rlib/rfile.py
+++ b/rpython/rlib/rfile.py
@@ -204,6 +204,8 @@
class RFile(object):
+ _readable = True
+ _writable = True
_setbuf = lltype.nullptr(rffi.CCHARP.TO)
_univ_newline = False
_newlinetypes = NEWLINE_UNKNOWN
@@ -213,6 +215,13 @@
self._ll_file = ll_file
if mode is not None:
self._univ_newline = 'U' in mode
+ self._readable = self._writable = False
+ if 'r' in mode or self._univ_newline:
+ self._readable = True
+ if 'w' in mode or 'a' in mode:
+ self._writable = True
+ if '+' in mode:
+ self._readable = self._writable = True
self._close2 = close2
def _setbufsize(self, bufsize):
@@ -277,6 +286,14 @@
if not self._ll_file:
raise ValueError("I/O operation on closed file")
+ def _check_readable(self):
+ if not self._readable:
+ raise IOError("File not open for reading")
+
+ def _check_writable(self):
+ if not self._writable:
+ raise IOError("File not open for writing")
+
def _fread(self, buf, n, stream):
if not self._univ_newline:
return c_fread(buf, 1, n, stream)
@@ -325,6 +342,7 @@
def read(self, size=-1):
self._check_closed()
+ self._check_readable()
ll_file = self._ll_file
bytesrequested = size
@@ -403,6 +421,7 @@
def readline(self, size=-1):
self._check_closed()
+ self._check_readable()
if size == 0:
return ""
elif size < 0 and not self._univ_newline:
@@ -471,6 +490,7 @@
@enforceargs(None, str)
def write(self, value):
self._check_closed()
+ self._check_writable()
ll_value = rffi.get_nonmovingbuffer(value)
try:
# note that since we got a nonmoving buffer, it is either raw
@@ -492,6 +512,7 @@
def truncate(self, arg=-1):
self._check_closed()
+ self._check_writable()
if arg == -1:
arg = self.tell()
self.flush()
More information about the pypy-commit
mailing list