diff options
author | Nobuyoshi Nakada <nobu@ruby-lang.org> | 2020-02-12 20:09:57 +0900 |
---|---|---|
committer | Nobuyoshi Nakada <nobu@ruby-lang.org> | 2020-02-12 20:09:57 +0900 |
commit | 160d3165eb095d81ae6e156f832a99728c853b01 (patch) | |
tree | 77f6422d7840b9f0011520e11c89f8646d2f4a24 | |
parent | bdf3032e3542b318c6f52dbe20d1c97cca3d7067 (diff) | |
download | ruby-160d3165eb095d81ae6e156f832a99728c853b01.tar.gz |
Copy non-inlined encoding index
-rw-r--r-- | string.c | 6 | ||||
-rw-r--r-- | test/ruby/test_encoding.rb | 2 |
2 files changed, 8 insertions, 0 deletions
@@ -1511,6 +1511,7 @@ str_duplicate(VALUE klass, VALUE str) ; VALUE flags = FL_TEST_RAW(str, flag_mask); VALUE dup = str_alloc(klass); + int encidx = 0; MEMCPY(RSTRING(dup)->as.ary, RSTRING(str)->as.ary, char, embed_size); if (flags & STR_NOEMBED) { @@ -1530,7 +1531,12 @@ str_duplicate(VALUE klass, VALUE str) 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); + if (encidx) rb_enc_associate_index(dup, encidx); return dup; } diff --git a/test/ruby/test_encoding.rb b/test/ruby/test_encoding.rb index d571dd28c1..80bed39936 100644 --- a/test/ruby/test_encoding.rb +++ b/test/ruby/test_encoding.rb @@ -74,6 +74,8 @@ class TestEncoding < Test::Unit::TestCase e = Encoding.list.last format = "%d".force_encoding(e) assert_equal("0", format % 0) + assert_equal(e, format.dup.encoding) + assert_equal(e, (format*1).encoding) end; end |