[pypy-commit] pypy default: more cleanup
bdkearns
noreply at buildbot.pypy.org
Fri Aug 29 22:37:42 CEST 2014
Author: Brian Kearns <bdkearns at gmail.com>
Branch:
Changeset: r73195:e3103fe6a9e9
Date: 2014-08-29 16:33 -0400
http://bitbucket.org/pypy/pypy/changeset/e3103fe6a9e9/
Log: more cleanup
diff --git a/rpython/rlib/rfile.py b/rpython/rlib/rfile.py
--- a/rpython/rlib/rfile.py
+++ b/rpython/rlib/rfile.py
@@ -57,12 +57,12 @@
[rffi.INT, rffi.CCHARP], FILEP)
c_tmpfile = llexternal('tmpfile', [], FILEP)
+c_setvbuf = llexternal('setvbuf', [FILEP, rffi.CCHARP, rffi.INT, rffi.SIZE_T],
+ rffi.INT)
+
c_fclose = llexternal('fclose', [FILEP], rffi.INT)
c_pclose = llexternal('pclose', [FILEP], rffi.INT)
-c_setvbuf = llexternal('setvbuf', [FILEP, rffi.CCHARP, rffi.INT, rffi.SIZE_T],
- rffi.INT)
-
c_getc = llexternal('getc', [FILEP], rffi.INT, macro=True)
c_fgets = llexternal('fgets', [rffi.CCHARP, rffi.INT, FILEP], rffi.CCHARP)
c_fread = llexternal('fread', [rffi.CCHARP, rffi.SIZE_T, rffi.SIZE_T, FILEP],
@@ -125,37 +125,38 @@
try:
ll_mode = rffi.str2charp(mode)
try:
- ll_f = c_fopen(ll_name, ll_mode)
- if not ll_f:
+ ll_file = c_fopen(ll_name, ll_mode)
+ if not ll_file:
errno = rposix.get_errno()
raise OSError(errno, os.strerror(errno))
finally:
lltype.free(ll_mode, flavor='raw')
finally:
lltype.free(ll_name, flavor='raw')
- _dircheck(ll_f)
+ _dircheck(ll_file)
if buffering >= 0:
+ buf = lltype.nullptr(rffi.CCHARP.TO)
if buffering == 0:
- c_setvbuf(ll_f, lltype.nullptr(rffi.CCHARP.TO), _IONBF, 0)
+ c_setvbuf(ll_file, buf, _IONBF, 0)
elif buffering == 1:
- c_setvbuf(ll_f, lltype.nullptr(rffi.CCHARP.TO), _IOLBF, BUFSIZ)
+ c_setvbuf(ll_file, buf, _IOLBF, BUFSIZ)
else:
- c_setvbuf(ll_f, lltype.nullptr(rffi.CCHARP.TO), _IOFBF, buffering)
- return RFile(ll_f)
+ c_setvbuf(ll_file, buf, _IOFBF, buffering)
+ return RFile(ll_file)
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)
- if not ll_f:
+ ll_file = c_fdopen(rffi.cast(rffi.INT, fd), ll_mode)
+ if not ll_file:
errno = rposix.get_errno()
raise OSError(errno, os.strerror(errno))
finally:
lltype.free(ll_mode, flavor='raw')
- _dircheck(ll_f)
- return RFile(ll_f)
+ _dircheck(ll_file)
+ return RFile(ll_file)
def create_temp_rfile():
@@ -171,39 +172,24 @@
try:
ll_type = rffi.str2charp(type)
try:
- ll_f = c_popen(ll_command, ll_type)
- if not ll_f:
+ ll_file = c_popen(ll_command, ll_type)
+ if not ll_file:
errno = rposix.get_errno()
raise OSError(errno, os.strerror(errno))
finally:
lltype.free(ll_type, flavor='raw')
finally:
lltype.free(ll_command, flavor='raw')
- return RPopenFile(ll_f)
+ return RFile(ll_file, c_pclose)
class RFile(object):
- def __init__(self, ll_file):
- self.ll_file = ll_file
+ def __init__(self, ll_file, do_close=c_fclose):
+ self._ll_file = ll_file
+ self._do_close = do_close
- def _check_closed(self):
- if not self.ll_file:
- raise ValueError("I/O operation on closed file")
-
- @enforceargs(None, str)
- def write(self, value):
- self._check_closed()
- ll_value = rffi.get_nonmovingbuffer(value)
- try:
- # note that since we got a nonmoving buffer, it is either raw
- # or already cannot move, so the arithmetics below are fine
- length = len(value)
- bytes = c_fwrite(ll_value, 1, length, self.ll_file)
- if bytes != length:
- errno = rposix.get_errno()
- raise OSError(errno, os.strerror(errno))
- finally:
- rffi.free_nonmovingbuffer(value, ll_value)
+ def __del__(self):
+ self.close()
def close(self):
"""Closes the described file.
@@ -214,22 +200,24 @@
The actual return value may be determined with os.WEXITSTATUS.
"""
res = 0
- ll_file = self.ll_file
+ ll_file = self._ll_file
if ll_file:
# double close is allowed
- self.ll_file = lltype.nullptr(FILEP.TO)
+ self._ll_file = lltype.nullptr(FILEP.TO)
res = self._do_close(ll_file)
if res == -1:
errno = rposix.get_errno()
raise OSError(errno, os.strerror(errno))
return res
- _do_close = staticmethod(c_fclose) # overridden in RPopenFile
+ def _check_closed(self):
+ if not self._ll_file:
+ raise ValueError("I/O operation on closed file")
def read(self, size=-1):
# XXX CPython uses a more delicate logic here
self._check_closed()
- ll_file = self.ll_file
+ ll_file = self._ll_file
if size == 0:
return ""
elif size < 0:
@@ -258,47 +246,8 @@
s = buf.str(returned_size)
return s
- def seek(self, pos, whence=0):
- self._check_closed()
- res = c_fseek(self.ll_file, pos, whence)
- if res == -1:
- errno = rposix.get_errno()
- raise OSError(errno, os.strerror(errno))
-
- def fileno(self):
- self._check_closed()
- return intmask(c_fileno(self.ll_file))
-
- def tell(self):
- self._check_closed()
- res = intmask(c_ftell(self.ll_file))
- if res == -1:
- errno = rposix.get_errno()
- raise OSError(errno, os.strerror(errno))
- return res
-
- def flush(self):
- self._check_closed()
- res = c_fflush(self.ll_file)
- if res != 0:
- errno = rposix.get_errno()
- raise OSError(errno, os.strerror(errno))
-
- def truncate(self, arg=-1):
- self._check_closed()
- if arg == -1:
- arg = self.tell()
- self.flush()
- res = c_ftruncate(self.fileno(), arg)
- if res == -1:
- errno = rposix.get_errno()
- raise OSError(errno, os.strerror(errno))
-
- def __del__(self):
- self.close()
-
def _readline1(self, raw_buf):
- ll_file = self.ll_file
+ ll_file = self._ll_file
for i in range(BASE_LINE_SIZE):
raw_buf[i] = '\n'
@@ -351,7 +300,7 @@
s.append_charpsize(buf.raw, c)
return s.build()
else: # size > 0
- ll_file = self.ll_file
+ ll_file = self._ll_file
s = StringBuilder()
while s.getlength() < size:
c = c_getc(ll_file)
@@ -365,6 +314,53 @@
break
return s.build()
+ @enforceargs(None, str)
+ def write(self, value):
+ self._check_closed()
+ ll_value = rffi.get_nonmovingbuffer(value)
+ try:
+ # note that since we got a nonmoving buffer, it is either raw
+ # or already cannot move, so the arithmetics below are fine
+ length = len(value)
+ bytes = c_fwrite(ll_value, 1, length, self._ll_file)
+ if bytes != length:
+ errno = rposix.get_errno()
+ raise OSError(errno, os.strerror(errno))
+ finally:
+ rffi.free_nonmovingbuffer(value, ll_value)
-class RPopenFile(RFile):
- _do_close = staticmethod(c_pclose)
+ def flush(self):
+ self._check_closed()
+ res = c_fflush(self._ll_file)
+ if res != 0:
+ errno = rposix.get_errno()
+ raise OSError(errno, os.strerror(errno))
+
+ def truncate(self, arg=-1):
+ self._check_closed()
+ if arg == -1:
+ arg = self.tell()
+ self.flush()
+ res = c_ftruncate(self.fileno(), arg)
+ if res == -1:
+ errno = rposix.get_errno()
+ raise OSError(errno, os.strerror(errno))
+
+ def seek(self, pos, whence=0):
+ self._check_closed()
+ res = c_fseek(self._ll_file, pos, whence)
+ if res == -1:
+ errno = rposix.get_errno()
+ raise OSError(errno, os.strerror(errno))
+
+ def tell(self):
+ self._check_closed()
+ res = intmask(c_ftell(self._ll_file))
+ if res == -1:
+ errno = rposix.get_errno()
+ raise OSError(errno, os.strerror(errno))
+ return res
+
+ def fileno(self):
+ self._check_closed()
+ return intmask(c_fileno(self._ll_file))
More information about the pypy-commit
mailing list