зеркало из https://github.com/github/ruby.git
string.c: fix rb_external_str_new_with_enc
* string.c (rb_external_str_new_with_enc): do not search non-ascii by NULL pointer. [ruby-core:84055] [Bug #14150] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@60979 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
Родитель
f32bf7e678
Коммит
a1692f7fdf
|
@ -0,0 +1,21 @@
|
|||
#include "ruby.h"
|
||||
#include "ruby/encoding.h"
|
||||
|
||||
VALUE
|
||||
bug_str_buf_new(VALUE self, VALUE len)
|
||||
{
|
||||
return rb_str_buf_new(NUM2LONG(len));
|
||||
}
|
||||
|
||||
VALUE
|
||||
bug_external_str_new(VALUE self, VALUE len, VALUE enc)
|
||||
{
|
||||
return rb_external_str_new_with_enc(NULL, NUM2LONG(len), rb_to_encoding(enc));
|
||||
}
|
||||
|
||||
void
|
||||
Init_new(VALUE klass)
|
||||
{
|
||||
rb_define_singleton_method(klass, "buf_new", bug_str_buf_new, 1);
|
||||
rb_define_singleton_method(klass, "external_new", bug_external_str_new, 2);
|
||||
}
|
4
string.c
4
string.c
|
@ -1011,6 +1011,10 @@ rb_external_str_new_with_enc(const char *ptr, long len, rb_encoding *eenc)
|
|||
VALUE str;
|
||||
const int eidx = rb_enc_to_index(eenc);
|
||||
|
||||
if (!ptr) {
|
||||
return rb_tainted_str_new_with_enc(ptr, len, eenc);
|
||||
}
|
||||
|
||||
/* ASCII-8BIT case, no conversion */
|
||||
if ((eidx == rb_ascii8bit_encindex()) ||
|
||||
(eidx == rb_usascii_encindex() && search_nonascii(ptr, ptr + len))) {
|
||||
|
|
|
@ -0,0 +1,11 @@
|
|||
# frozen_string_literal: false
|
||||
require 'test/unit'
|
||||
require '-test-/string'
|
||||
|
||||
class Test_StringExternalNew < Test::Unit::TestCase
|
||||
def test_external_new_with_enc
|
||||
Encoding.list.each do |enc|
|
||||
assert_equal(enc, Bug::String.external_new(0, enc).encoding)
|
||||
end
|
||||
end
|
||||
end
|
Загрузка…
Ссылка в новой задаче