diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2016-05-30 05:54:59 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2016-05-30 05:54:59 +0000 |
commit | ea7373574ad4703dac977b0f3e7cd332f2acd0b8 (patch) | |
tree | fe1c41773aac9b2704ec8ad5740f54cad6d79cff | |
parent | 9ac5f9135a160975f76c74a1fa09e3d235995307 (diff) | |
download | ruby-ea7373574ad4703dac977b0f3e7cd332f2acd0b8.tar.gz |
stringio.c: share strings
* ext/stringio/stringio.c (enc_subseq): share the return value and
the buffer as possible.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@55210 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | ext/stringio/stringio.c | 20 |
2 files changed, 20 insertions, 5 deletions
@@ -1,3 +1,8 @@ +Mon May 30 14:54:58 2016 Nobuyoshi Nakada <nobu@ruby-lang.org> + + * ext/stringio/stringio.c (enc_subseq): share the return value and + the buffer as possible. + Mon May 30 14:50:25 2016 Nobuyoshi Nakada <nobu@ruby-lang.org> * string.c (str_substr, rb_str_aref): refactor not to create diff --git a/ext/stringio/stringio.c b/ext/stringio/stringio.c index 368dcfec4b..7dd6d4f827 100644 --- a/ext/stringio/stringio.c +++ b/ext/stringio/stringio.c @@ -96,6 +96,14 @@ get_strio(VALUE self) } static VALUE +enc_subseq(VALUE str, long pos, long len, rb_encoding *enc) +{ + str = rb_str_subseq(str, pos, len); + rb_enc_associate(str, enc); + return str; +} + +static VALUE strio_substr(struct StringIO *ptr, long pos, long len) { VALUE str = ptr->string; @@ -105,7 +113,7 @@ strio_substr(struct StringIO *ptr, long pos, long len) if (len > rlen) len = rlen; if (len < 0) len = 0; if (len == 0) return rb_str_new(0,0); - return rb_enc_str_new(RSTRING_PTR(str)+pos, len, enc); + return enc_subseq(str, pos, len, enc); } #define StringIO(obj) get_strio(obj) @@ -690,16 +698,18 @@ strio_getc(VALUE self) { struct StringIO *ptr = readable(self); rb_encoding *enc = get_enc(ptr); + VALUE str = ptr->string; + long pos = ptr->pos; int len; char *p; - if (ptr->pos >= RSTRING_LEN(ptr->string)) { + if (pos >= RSTRING_LEN(str)) { return Qnil; } - p = RSTRING_PTR(ptr->string)+ptr->pos; - len = rb_enc_mbclen(p, RSTRING_END(ptr->string), enc); + p = RSTRING_PTR(str)+pos; + len = rb_enc_mbclen(p, RSTRING_END(str), enc); ptr->pos += len; - return rb_enc_str_new(p, len, enc); + return enc_subseq(str, pos, len, enc); } /* |