* string.c: Specify termlen as far as possible.
Additional fix for [Bug #12536] [ruby-dev:49699]. * string.c (rb_usascii_str_new, rb_utf8_str_new): Specify termlen which is apparently 1 for the encodings. * string.c (str_new0_cstr): New static function to create a String object from a C string with specifying termlen. * string.c (rb_usascii_str_new_cstr, rb_utf8_str_new_cstr): Specify termlen by using new str_new0_cstr(). * string.c (str_new_static): Specify termlen from the given encoding when creating a new String object is needed. * string.c (rb_tainted_str_new_with_enc): New function to create a tainted String object with the given encoding. This means that the termlen is correctly specified. Curretly static function. The function name might be renamed to rb_tainted_enc_str_new or rb_enc_tainted_str_new. * string.c (rb_external_str_new_with_enc): Use encoding by using the above rb_tainted_str_new_with_enc(). git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@55555 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
053c1e08e3
commit
a92a537bf4
26
ChangeLog
26
ChangeLog
@ -1,3 +1,29 @@
|
|||||||
|
Fri Jul 1 20:20:20 2016 Naohisa Goto <ngotogenome@gmail.com>
|
||||||
|
|
||||||
|
* string.c: Specify termlen as far as possible.
|
||||||
|
Additional fix for [Bug #12536] [ruby-dev:49699].
|
||||||
|
|
||||||
|
* string.c (rb_usascii_str_new, rb_utf8_str_new): Specify termlen
|
||||||
|
which is apparently 1 for the encodings.
|
||||||
|
|
||||||
|
* string.c (str_new0_cstr): New static function to create a String
|
||||||
|
object from a C string with specifying termlen.
|
||||||
|
|
||||||
|
* string.c (rb_usascii_str_new_cstr, rb_utf8_str_new_cstr): Specify
|
||||||
|
termlen by using new str_new0_cstr().
|
||||||
|
|
||||||
|
* string.c (str_new_static): Specify termlen from the given encoding
|
||||||
|
when creating a new String object is needed.
|
||||||
|
|
||||||
|
* string.c (rb_tainted_str_new_with_enc): New function to create a
|
||||||
|
tainted String object with the given encoding. This means that
|
||||||
|
the termlen is correctly specified. Curretly static function.
|
||||||
|
The function name might be renamed to rb_tainted_enc_str_new
|
||||||
|
or rb_enc_tainted_str_new.
|
||||||
|
|
||||||
|
* string.c (rb_external_str_new_with_enc): Use encoding by using the
|
||||||
|
above rb_tainted_str_new_with_enc().
|
||||||
|
|
||||||
Fri Jul 1 19:38:57 2016 Naohisa Goto <ngotogenome@gmail.com>
|
Fri Jul 1 19:38:57 2016 Naohisa Goto <ngotogenome@gmail.com>
|
||||||
|
|
||||||
* test/fiddle/test_pointer.rb (test_to_str, test_to_s, test_aref_aset):
|
* test/fiddle/test_pointer.rb (test_to_str, test_to_s, test_aref_aset):
|
||||||
|
29
string.c
29
string.c
@ -726,7 +726,7 @@ rb_str_new(const char *ptr, long len)
|
|||||||
VALUE
|
VALUE
|
||||||
rb_usascii_str_new(const char *ptr, long len)
|
rb_usascii_str_new(const char *ptr, long len)
|
||||||
{
|
{
|
||||||
VALUE str = rb_str_new(ptr, len);
|
VALUE str = str_new0(rb_cString, ptr, len, 1); /* termlen == 1 */
|
||||||
ENCODING_CODERANGE_SET(str, rb_usascii_encindex(), ENC_CODERANGE_7BIT);
|
ENCODING_CODERANGE_SET(str, rb_usascii_encindex(), ENC_CODERANGE_7BIT);
|
||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
@ -734,7 +734,7 @@ rb_usascii_str_new(const char *ptr, long len)
|
|||||||
VALUE
|
VALUE
|
||||||
rb_utf8_str_new(const char *ptr, long len)
|
rb_utf8_str_new(const char *ptr, long len)
|
||||||
{
|
{
|
||||||
VALUE str = str_new(rb_cString, ptr, len);
|
VALUE str = str_new0(rb_cString, ptr, len, 1); /* termlen == 1 */
|
||||||
rb_enc_associate_index(str, rb_utf8_encindex());
|
rb_enc_associate_index(str, rb_utf8_encindex());
|
||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
@ -758,10 +758,17 @@ rb_str_new_cstr(const char *ptr)
|
|||||||
return rb_str_new(ptr, strlen(ptr));
|
return rb_str_new(ptr, strlen(ptr));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static VALUE
|
||||||
|
str_new0_cstr(const char *ptr, int termlen)
|
||||||
|
{
|
||||||
|
must_not_null(ptr);
|
||||||
|
return str_new0(rb_cString, ptr, strlen(ptr), termlen);
|
||||||
|
}
|
||||||
|
|
||||||
VALUE
|
VALUE
|
||||||
rb_usascii_str_new_cstr(const char *ptr)
|
rb_usascii_str_new_cstr(const char *ptr)
|
||||||
{
|
{
|
||||||
VALUE str = rb_str_new_cstr(ptr);
|
VALUE str = str_new0_cstr(ptr, 1); /* termlen == 1 */
|
||||||
ENCODING_CODERANGE_SET(str, rb_usascii_encindex(), ENC_CODERANGE_7BIT);
|
ENCODING_CODERANGE_SET(str, rb_usascii_encindex(), ENC_CODERANGE_7BIT);
|
||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
@ -769,7 +776,7 @@ rb_usascii_str_new_cstr(const char *ptr)
|
|||||||
VALUE
|
VALUE
|
||||||
rb_utf8_str_new_cstr(const char *ptr)
|
rb_utf8_str_new_cstr(const char *ptr)
|
||||||
{
|
{
|
||||||
VALUE str = rb_str_new_cstr(ptr);
|
VALUE str = str_new0_cstr(ptr, 1); /* termlen == 1 */
|
||||||
rb_enc_associate_index(str, rb_utf8_encindex());
|
rb_enc_associate_index(str, rb_utf8_encindex());
|
||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
@ -794,7 +801,8 @@ str_new_static(VALUE klass, const char *ptr, long len, int encindex)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!ptr) {
|
if (!ptr) {
|
||||||
str = str_new(klass, ptr, len);
|
rb_encoding *enc = rb_enc_get_from_index(encindex);
|
||||||
|
str = str_new0(klass, ptr, len, rb_enc_mbminlen(enc));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
RUBY_DTRACE_CREATE_HOOK(STRING, len);
|
RUBY_DTRACE_CREATE_HOOK(STRING, len);
|
||||||
@ -842,6 +850,15 @@ rb_tainted_str_new(const char *ptr, long len)
|
|||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static VALUE
|
||||||
|
rb_tainted_str_new_with_enc(const char *ptr, long len, rb_encoding *enc)
|
||||||
|
{
|
||||||
|
VALUE str = rb_enc_str_new(ptr, len, enc);
|
||||||
|
|
||||||
|
OBJ_TAINT(str);
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
VALUE
|
VALUE
|
||||||
rb_tainted_str_new_cstr(const char *ptr)
|
rb_tainted_str_new_cstr(const char *ptr)
|
||||||
{
|
{
|
||||||
@ -974,7 +991,7 @@ rb_external_str_new_with_enc(const char *ptr, long len, rb_encoding *eenc)
|
|||||||
{
|
{
|
||||||
VALUE str;
|
VALUE str;
|
||||||
|
|
||||||
str = rb_tainted_str_new(ptr, len);
|
str = rb_tainted_str_new_with_enc(ptr, len, eenc);
|
||||||
return rb_external_str_with_enc(str, eenc);
|
return rb_external_str_with_enc(str, eenc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user