[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