mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
string.c: return reallocated pointer
* string.c (str_fill_term): return new pointer reallocated by filling terminator. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@55212 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
bfc9c3766f
commit
79a85b18cc
4 changed files with 36 additions and 1 deletions
|
@ -1,3 +1,8 @@
|
||||||
|
Mon May 30 16:20:26 2016 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
|
* string.c (str_fill_term): return new pointer reallocated by
|
||||||
|
filling terminator.
|
||||||
|
|
||||||
Mon May 30 14:54:58 2016 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
Mon May 30 14:54:58 2016 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
* ext/stringio/stringio.c (enc_subseq): share the return value and
|
* ext/stringio/stringio.c (enc_subseq): share the return value and
|
||||||
|
|
|
@ -49,6 +49,28 @@ bug_str_cstr_term_char(VALUE str)
|
||||||
return rb_enc_uint_chr((unsigned int)c, enc);
|
return rb_enc_uint_chr((unsigned int)c, enc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static VALUE
|
||||||
|
bug_str_unterminated_substring(VALUE str, VALUE vbeg, VALUE vlen)
|
||||||
|
{
|
||||||
|
long beg = NUM2LONG(vbeg);
|
||||||
|
long len = NUM2LONG(vlen);
|
||||||
|
rb_str_modify(str);
|
||||||
|
if (len < 0) rb_raise(rb_eArgError, "negative length: %ld", len);
|
||||||
|
if (RSTRING_LEN(str) < beg) rb_raise(rb_eIndexError, "beg: %ld", beg);
|
||||||
|
if (RSTRING_LEN(str) < beg + len) rb_raise(rb_eIndexError, "end: %ld", beg + len);
|
||||||
|
str = rb_str_new_shared(str);
|
||||||
|
if (STR_EMBED_P(str)) {
|
||||||
|
RSTRING(str)->basic.flags &= ~RSTRING_EMBED_LEN_MASK;
|
||||||
|
RSTRING(str)->basic.flags |= len << RSTRING_EMBED_LEN_SHIFT;
|
||||||
|
memmove(RSTRING(str)->as.ary, RSTRING(str)->as.ary + beg, len);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
RSTRING(str)->as.heap.ptr += beg;
|
||||||
|
RSTRING(str)->as.heap.len = len;
|
||||||
|
}
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
static VALUE
|
static VALUE
|
||||||
bug_str_s_cstr_term(VALUE self, VALUE str)
|
bug_str_s_cstr_term(VALUE self, VALUE str)
|
||||||
{
|
{
|
||||||
|
@ -114,6 +136,7 @@ Init_cstr(VALUE klass)
|
||||||
rb_define_method(klass, "cstr_term", bug_str_cstr_term, 0);
|
rb_define_method(klass, "cstr_term", bug_str_cstr_term, 0);
|
||||||
rb_define_method(klass, "cstr_unterm", bug_str_cstr_unterm, 1);
|
rb_define_method(klass, "cstr_unterm", bug_str_cstr_unterm, 1);
|
||||||
rb_define_method(klass, "cstr_term_char", bug_str_cstr_term_char, 0);
|
rb_define_method(klass, "cstr_term_char", bug_str_cstr_term_char, 0);
|
||||||
|
rb_define_method(klass, "unterminated_substring", bug_str_unterminated_substring, 2);
|
||||||
rb_define_singleton_method(klass, "cstr_term", bug_str_s_cstr_term, 1);
|
rb_define_singleton_method(klass, "cstr_term", bug_str_s_cstr_term, 1);
|
||||||
rb_define_singleton_method(klass, "cstr_unterm", bug_str_s_cstr_unterm, 2);
|
rb_define_singleton_method(klass, "cstr_unterm", bug_str_s_cstr_unterm, 2);
|
||||||
rb_define_singleton_method(klass, "cstr_term_char", bug_str_s_cstr_term_char, 1);
|
rb_define_singleton_method(klass, "cstr_term_char", bug_str_s_cstr_term_char, 1);
|
||||||
|
|
3
string.c
3
string.c
|
@ -2012,9 +2012,10 @@ str_fill_term(VALUE str, char *s, long len, int termlen)
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
TERM_FILL(s + len, termlen);
|
TERM_FILL(s + len, termlen);
|
||||||
}
|
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
return RSTRING_PTR(str);
|
||||||
|
}
|
||||||
|
|
||||||
char *
|
char *
|
||||||
rb_string_value_cstr(volatile VALUE *ptr)
|
rb_string_value_cstr(volatile VALUE *ptr)
|
||||||
|
|
|
@ -18,6 +18,12 @@ class Test_StringCStr < Test::Unit::TestCase
|
||||||
assert_equal(0, s.cstr_term, Bug4319)
|
assert_equal(0, s.cstr_term, Bug4319)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_shared
|
||||||
|
s = Bug::String.new("abcdef")*5
|
||||||
|
s = s.unterminated_substring(0, 29)
|
||||||
|
assert_equal(0, s.cstr_term, Bug4319)
|
||||||
|
end
|
||||||
|
|
||||||
def test_frozen
|
def test_frozen
|
||||||
s0 = Bug::String.new("abcdefgh"*8)
|
s0 = Bug::String.new("abcdefgh"*8)
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue