From 6776e0bc99abfbdb9e4c406c447942e971af37ff Mon Sep 17 00:00:00 2001 From: normal Date: Fri, 5 Jan 2018 21:14:19 +0000 Subject: 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 diff --git a/io.c b/io.c index f14e144..1986d3e 100644 --- a/io.c +++ b/io.c @@ -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; -- cgit v0.10.2