summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornormal <normal@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-01-05 21:14:19 +0000
committernormal <normal@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-01-05 21:14:19 +0000
commit6776e0bc99abfbdb9e4c406c447942e971af37ff (patch)
tree8480ae12f05380fe644487d3fac030d72499d47f
parenta55abcc0ca6f628fc05304f81e5a044d65ab4a68 (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
-rw-r--r--io.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/io.c b/io.c
index f14e1440ca..1986d3e73b 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;