зеркало из https://github.com/github/ruby.git
Copy non-inlined encoding index
This commit is contained in:
Родитель
bdf3032e35
Коммит
160d3165eb
6
string.c
6
string.c
|
@ -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
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче