diff options
author | normal <normal@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-01-05 21:14:19 +0000 |
---|---|---|
committer | normal <normal@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-01-05 21:14:19 +0000 |
commit | 6776e0bc99abfbdb9e4c406c447942e971af37ff (patch) | |
tree | 8480ae12f05380fe644487d3fac030d72499d47f /io.c | |
parent | a55abcc0ca6f628fc05304f81e5a044d65ab4a68 (diff) |
io.c: clear Strings we create for IO.copy_stream
While we can't recycle strings after giving them rb_funcall*,
we can reduce their malloc overhead by resizing them to zero.
This only affects cases where either `src' or `dst' is a non-IO
object and either `copy_length' is passed or there is
pre-existing data in the read buffer.
* io.c (copy_stream_fallback_body): clear when done with `copy_length'
(copy_stream_body): clear when done with pre-existing read buffer
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@61632 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'io.c')
-rw-r--r-- | io.c | 7 |
1 files changed, 5 insertions, 2 deletions
@@ -11163,8 +11163,10 @@ copy_stream_fallback_body(VALUE arg) l = buflen; } else { - if (rest == 0) - break; + if (rest == 0) { + rb_str_resize(buf, 0); + break; + } l = buflen < rest ? buflen : (long)rest; } if (stp->src_fd == -1) { @@ -11305,6 +11307,7 @@ copy_stream_body(VALUE arg) } else /* others such as StringIO */ rb_io_write(dst_io, str); + rb_str_resize(str, 0); stp->total += len; if (stp->copy_length != (off_t)-1) stp->copy_length -= len; |