Copy non-inlined encoding index

This commit is contained in:
Nobuyoshi Nakada 2020-02-12 20:09:57 +09:00
Родитель bdf3032e35
Коммит 160d3165eb
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4BC7D6DF58D8DF60
2 изменённых файлов: 8 добавлений и 0 удалений

Просмотреть файл

@ -1511,6 +1511,7 @@ str_duplicate(VALUE klass, VALUE str)
; ;
VALUE flags = FL_TEST_RAW(str, flag_mask); VALUE flags = FL_TEST_RAW(str, flag_mask);
VALUE dup = str_alloc(klass); VALUE dup = str_alloc(klass);
int encidx = 0;
MEMCPY(RSTRING(dup)->as.ary, RSTRING(str)->as.ary, MEMCPY(RSTRING(dup)->as.ary, RSTRING(str)->as.ary,
char, embed_size); char, embed_size);
if (flags & STR_NOEMBED) { if (flags & STR_NOEMBED) {
@ -1530,7 +1531,12 @@ str_duplicate(VALUE klass, VALUE str)
char, embed_size); char, embed_size);
} }
} }
if ((flags & ENCODING_MASK) == (ENCODING_INLINE_MAX<<ENCODING_SHIFT)) {
encidx = rb_enc_get_index(str);
flags &= ~ENCODING_MASK;
}
FL_SET_RAW(dup, flags & ~FL_FREEZE); FL_SET_RAW(dup, flags & ~FL_FREEZE);
if (encidx) rb_enc_associate_index(dup, encidx);
return dup; return dup;
} }

Просмотреть файл

@ -74,6 +74,8 @@ class TestEncoding < Test::Unit::TestCase
e = Encoding.list.last e = Encoding.list.last
format = "%d".force_encoding(e) format = "%d".force_encoding(e)
assert_equal("0", format % 0) assert_equal("0", format % 0)
assert_equal(e, format.dup.encoding)
assert_equal(e, (format*1).encoding)
end; end;
end end