[pypy-commit] pypy use-file-star-for-file: merge default

bdkearns noreply at buildbot.pypy.org
Fri Aug 29 22:37:43 CEST 2014


Author: Brian Kearns <bdkearns at gmail.com>
Branch: use-file-star-for-file
Changeset: r73196:3f3b478b3f53
Date: 2014-08-29 16:33 -0400
http://bitbucket.org/pypy/pypy/changeset/3f3b478b3f53/

Log:	merge default

diff --git a/pypy/module/_pypyjson/interp_encoder.py b/pypy/module/_pypyjson/interp_encoder.py
--- a/pypy/module/_pypyjson/interp_encoder.py
+++ b/pypy/module/_pypyjson/interp_encoder.py
@@ -29,7 +29,7 @@
         w_string = space.call_method(w_string, 'decode', space.wrap('utf-8'))
 
     u = space.unicode_w(w_string)
-    sb = StringBuilder()
+    sb = StringBuilder(len(u))
     for c in u:
         if c <= u'~':
             if c == u'"' or c == u'\\':
diff --git a/rpython/rlib/rfile.py b/rpython/rlib/rfile.py
--- a/rpython/rlib/rfile.py
+++ b/rpython/rlib/rfile.py
@@ -5,6 +5,7 @@
 
 import os, stat, errno
 from rpython.rlib import rposix
+from rpython.rlib.objectmodel import enforceargs
 from rpython.rlib.rarithmetic import intmask
 from rpython.rlib.rstring import StringBuilder
 from rpython.rtyper.lltypesystem import rffi, lltype
@@ -51,31 +52,34 @@
     return rffi.llexternal(*args, compilation_info=eci, **kwargs)
 
 c_fopen = llexternal('fopen', [rffi.CCHARP, rffi.CCHARP], FILEP)
-c_fclose = llexternal('fclose', [FILEP], rffi.INT, releasegil=False)
-c_fwrite = llexternal('fwrite', [rffi.CCHARP, rffi.SIZE_T, rffi.SIZE_T,
-                                 FILEP], rffi.SIZE_T)
-c_fread = llexternal('fread', [rffi.CCHARP, rffi.SIZE_T, rffi.SIZE_T,
-                               FILEP], rffi.SIZE_T)
+c_popen = llexternal('popen', [rffi.CCHARP, rffi.CCHARP], FILEP)
+c_fdopen = llexternal(('_' if os.name == 'nt' else '') + 'fdopen',
+                      [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_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],
+                     rffi.SIZE_T)
+
+c_fwrite = llexternal('fwrite', [rffi.CCHARP, rffi.SIZE_T, rffi.SIZE_T, FILEP],
+                      rffi.SIZE_T)
+c_fflush = llexternal('fflush', [FILEP], rffi.INT)
+c_ftruncate = llexternal(ftruncate, [rffi.INT, OFF_T], rffi.INT, macro=True)
+
+c_fseek = llexternal('fseek', [FILEP, rffi.LONG, rffi.INT], rffi.INT)
+c_ftell = llexternal('ftell', [FILEP], rffi.LONG)
+c_fileno = llexternal(fileno, [FILEP], rffi.INT)
+
 c_feof = llexternal('feof', [FILEP], rffi.INT)
 c_ferror = llexternal('ferror', [FILEP], rffi.INT)
 c_clearerr = llexternal('clearerr', [FILEP], lltype.Void)
-c_fseek = llexternal('fseek', [FILEP, rffi.LONG, rffi.INT],
-                     rffi.INT)
-c_tmpfile = llexternal('tmpfile', [], FILEP)
-c_fileno = llexternal(fileno, [FILEP], rffi.INT)
-c_fdopen = llexternal(('_' if os.name == 'nt' else '') + 'fdopen',
-                      [rffi.INT, rffi.CCHARP], FILEP)
-c_ftell = llexternal('ftell', [FILEP], rffi.LONG)
-c_fflush = llexternal('fflush', [FILEP], rffi.INT)
-c_ftruncate = llexternal(ftruncate, [rffi.INT, OFF_T], rffi.INT, macro=True)
-
-c_getc = llexternal('getc', [FILEP], rffi.INT, macro=True)
-c_fgets = llexternal('fgets', [rffi.CCHARP, rffi.INT, FILEP],
-                     rffi.CCHARP)
-
-c_popen = llexternal('popen', [rffi.CCHARP, rffi.CCHARP], FILEP)
-c_pclose = llexternal('pclose', [FILEP], rffi.INT, releasegil=False)
-c_setvbuf = llexternal('setvbuf', [FILEP, rffi.CCHARP, rffi.INT, rffi.SIZE_T], rffi.INT)
 
 
 def _error(ll_file):
@@ -121,23 +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_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_file)
+    return RFile(ll_file)
 
 
 def create_temp_rfile():
@@ -148,58 +167,29 @@
     return RFile(res)
 
 
-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:
-            errno = rposix.get_errno()
-            raise OSError(errno, os.strerror(errno))
-    finally:
-        lltype.free(ll_mode, flavor='raw')
-    _dircheck(ll_f)
-    return RFile(ll_f)
-
-
 def create_popen_file(command, type):
     ll_command = rffi.str2charp(command)
     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")
-
-    def write(self, value):
-        self._check_closed()
-        assert value is not None
-        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.
@@ -210,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:
@@ -254,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'
 
@@ -347,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)
@@ -361,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))
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
@@ -16,6 +16,13 @@
             f = open(fname, "w")
             f.write("dupa")
             f.close()
+            try:
+                f.write("dupb")
+            except ValueError:
+                pass
+            else:
+                assert False
+            f.close()
 
         f()
         self.interpret(f, [])


More information about the pypy-commit mailing list