[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