[pypy-commit] pypy use-file-star-for-file: avoid copies in more cases
bdkearns
noreply at buildbot.pypy.org
Wed Sep 17 01:30:48 CEST 2014
Author: Brian Kearns <bdkearns at gmail.com>
Branch: use-file-star-for-file
Changeset: r73571:16f3d4e99a89
Date: 2014-09-16 18:58 -0400
http://bitbucket.org/pypy/pypy/changeset/16f3d4e99a89/
Log: avoid copies in more cases
diff --git a/rpython/rlib/rfile.py b/rpython/rlib/rfile.py
--- a/rpython/rlib/rfile.py
+++ b/rpython/rlib/rfile.py
@@ -427,20 +427,19 @@
if s.getlength() > 0 and rposix.get_errno() == errno.EAGAIN:
break
raise _from_errno(IOError)
- elif chunksize == size:
- # we read everything in one call, try to avoid copy
- assert remainsize == size
- return rffi.str_from_buffer(raw_buf, gc_buf, remainsize, size)
- s.append_charpsize(raw_buf, chunksize)
if chunksize < remainsize and not interrupted:
c_clearerr(ll_file)
break
if size >= 0:
break
+ s.append_charpsize(raw_buf, chunksize)
buffersize = self._new_buffersize(buffersize)
remainsize = buffersize - s.getlength()
rffi.keep_buffer_alive_until_here(raw_buf, gc_buf)
raw_buf, gc_buf = rffi.alloc_buffer(remainsize)
+ if s.getlength() == 0:
+ return rffi.str_from_buffer(raw_buf, gc_buf, remainsize, chunksize)
+ s.append_charpsize(raw_buf, chunksize)
finally:
rffi.keep_buffer_alive_until_here(raw_buf, gc_buf)
return s.build()
@@ -566,11 +565,6 @@
if after: after()
self._newlinetypes = newlinetypes
self._skipnextlf = skipnextlf
- if i == size:
- # we read everything in one call, try to avoid copy
- assert remainsize == size
- return rffi.str_from_buffer(raw_buf, gc_buf, remainsize, size)
- s.append_charpsize(raw_buf, i)
if c == ord('\n'):
break
elif c == EOF:
@@ -587,13 +581,16 @@
self._signal_checker()
break
if size > 0:
- assert s.getlength() == size
break
+ s.append_charpsize(raw_buf, i)
buffersize += buffersize >> 2
remainsize = buffersize - s.getlength()
rffi.keep_buffer_alive_until_here(raw_buf, gc_buf)
raw_buf, gc_buf = rffi.alloc_buffer(remainsize)
i = 0
+ if s.getlength() == 0:
+ return rffi.str_from_buffer(raw_buf, gc_buf, remainsize, i)
+ s.append_charpsize(raw_buf, i)
finally:
rffi.keep_buffer_alive_until_here(raw_buf, gc_buf)
return s.build()
More information about the pypy-commit
mailing list