mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
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
This commit is contained in:
parent
9ac5f9135a
commit
ea7373574a
2 changed files with 20 additions and 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
|
||||
|
|
|
@ -95,6 +95,14 @@ get_strio(VALUE self)
|
|||
return ptr;
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
Loading…
Reference in a new issue