[pypy-commit] pypy default: Test and fix.

arigo noreply at buildbot.pypy.org
Mon Feb 10 11:00:59 CET 2014


Author: Armin Rigo <arigo at tunes.org>
Branch: 
Changeset: r69114:8c8b45fbe536
Date: 2014-02-10 11:00 +0100
http://bitbucket.org/pypy/pypy/changeset/8c8b45fbe536/

Log:	Test and fix.

diff --git a/rpython/rlib/rfile.py b/rpython/rlib/rfile.py
--- a/rpython/rlib/rfile.py
+++ b/rpython/rlib/rfile.py
@@ -29,9 +29,9 @@
 OFF_T = CC['off_t']
 c_open = llexternal('fopen', [rffi.CCHARP, rffi.CCHARP], lltype.Ptr(FILE))
 c_close = llexternal('fclose', [lltype.Ptr(FILE)], rffi.INT)
-c_write = llexternal('fwrite', [rffi.CCHARP, rffi.SIZE_T, rffi.SIZE_T,
+c_fwrite = llexternal('fwrite', [rffi.CCHARP, rffi.SIZE_T, rffi.SIZE_T,
                                      lltype.Ptr(FILE)], rffi.SIZE_T)
-c_read = llexternal('fread', [rffi.CCHARP, rffi.SIZE_T, rffi.SIZE_T,
+c_fread = llexternal('fread', [rffi.CCHARP, rffi.SIZE_T, rffi.SIZE_T,
                                    lltype.Ptr(FILE)], rffi.SIZE_T)
 c_feof = llexternal('feof', [lltype.Ptr(FILE)], rffi.INT)
 c_ferror = llexternal('ferror', [lltype.Ptr(FILE)], rffi.INT)
@@ -40,7 +40,7 @@
                           rffi.INT)
 c_tmpfile = llexternal('tmpfile', [], lltype.Ptr(FILE))
 c_fileno = llexternal('fileno', [lltype.Ptr(FILE)], rffi.INT)
-c_ftell = llexternal('ftell', [lltype.Ptr(FILE)], lltype.Signed)
+c_ftell = llexternal('ftell', [lltype.Ptr(FILE)], rffi.LONG)
 c_fflush = llexternal('fflush', [lltype.Ptr(FILE)], rffi.INT)
 c_ftruncate = llexternal('ftruncate', [rffi.INT, OFF_T], rffi.INT, macro=True)
 
@@ -89,18 +89,11 @@
         try:
             # note that since we got a nonmoving buffer, it is either raw
             # or already cannot move, so the arithmetics below are fine
-            total_bytes = 0
-            ll_current = ll_value
-            while total_bytes < len(value):
-                bytes = c_write(ll_current, 1, len(value) - r_uint(total_bytes),
-                                ll_file)
-                if bytes == 0:
-                    errno = rposix.get_errno()
-                    raise OSError(errno, os.strerror(errno))
-                total_bytes += bytes
-                ll_current = rffi.cast(rffi.CCHARP,
-                                       rffi.cast(lltype.Unsigned, ll_value) +
-                                       total_bytes)
+            length = len(value)
+            bytes = c_fwrite(ll_value, 1, length, ll_file)
+            if bytes != length:
+                errno = rposix.get_errno()
+                raise OSError(errno, os.strerror(errno))
         finally:
             rffi.free_nonmovingbuffer(value, ll_value)
 
@@ -124,7 +117,8 @@
             try:
                 s = StringBuilder()
                 while True:
-                    returned_size = c_read(buf, 1, BASE_BUF_SIZE, ll_file)
+                    returned_size = c_fread(buf, 1, BASE_BUF_SIZE, ll_file)
+                    returned_size = intmask(returned_size)  # is between 0 and BASE_BUF_SIZE
                     if returned_size == 0:
                         if c_feof(ll_file):
                             # ok, finished
@@ -138,13 +132,13 @@
         else:
             raw_buf, gc_buf = rffi.alloc_buffer(size)
             try:
-                returned_size = c_read(raw_buf, 1, size, ll_file)
+                returned_size = c_fread(raw_buf, 1, size, ll_file)
+                returned_size = intmask(returned_size)  # is between 0 and size
                 if returned_size == 0:
                     if not c_feof(ll_file):
                         errno = c_ferror(ll_file)
                         raise OSError(errno, os.strerror(errno))
-                s = rffi.str_from_buffer(raw_buf, gc_buf, size,
-                                         rffi.cast(lltype.Signed, returned_size))
+                s = rffi.str_from_buffer(raw_buf, gc_buf, size, returned_size)
             finally:
                 rffi.keep_buffer_alive_until_here(raw_buf, gc_buf)
             return s
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
@@ -142,6 +142,15 @@
         cls.tmpdir = udir.join('test_rfile_direct')
         cls.tmpdir.ensure(dir=True)
 
+    def test_read_a_lot(self):
+        fname = str(self.tmpdir.join('file_read_a_lot'))
+        with open(fname, 'w') as f:
+            f.write('dupa' * 999)
+        f = rfile.create_file(fname, 'r')
+        s = f.read()
+        assert s == 'dupa' * 999
+        f.close()
+
     def test_readline(self):
         fname = str(self.tmpdir.join('file_readline'))
         j = 0


More information about the pypy-commit mailing list